linderhof/roles/provision/tasks/hetzner.yml
Matthias Johnson bd90a7e16f Automate DKIM sync and add Hetzner resource labels
- Add dkim_sync.yml: generates DKIM keys for all mail_domains, writes
  keys to stack config (group_vars/all/dkim.yml), and publishes
  mail._domainkey TXT records via dns.yml — replaces manual vault editing
- Remove dkim_keys from vault.yml.setup (public keys don't need encryption)
- Add hcloud_labels to config.yml.setup and apply to server + SSH key in
  provision role, enabling project-level tagging of Hetzner resources
- Fix setup.sh next steps: add missing bootstrap step, replace manual DKIM
  instructions with dkim_sync.yml
- Update CLAUDE.md and README.md accordingly

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28 19:06:24 -07:00

49 lines
1.4 KiB
YAML

---
- name: Register SSH key with Hetzner
hetzner.hcloud.ssh_key:
name: "{{ admin_user }}"
public_key: "{{ admin_ssh_key }}"
labels: "{{ hcloud_labels }}"
api_token: "{{ hcloud_token }}"
state: present
- name: Create server
hetzner.hcloud.server:
name: "{{ server_name }}"
server_type: "{{ hcloud_server_type }}"
image: "{{ hcloud_image }}"
location: "{{ hcloud_location }}"
ssh_keys:
- "{{ admin_user }}"
labels: "{{ hcloud_labels }}"
api_token: "{{ hcloud_token }}"
state: present
register: server_result
- name: Set server IP fact
ansible.builtin.set_fact:
server_ip: "{{ server_result.hcloud_server.ipv4_address }}"
- name: Wait for SSH to become available
ansible.builtin.wait_for:
host: "{{ server_ip }}"
port: 22
timeout: 300
- name: Update inventory with new IP
ansible.builtin.lineinfile:
path: "{{ lookup('env', 'LINDERHOF_DIR') }}/hosts.yml"
regexp: '^\s+ansible_host:'
line: " ansible_host: {{ server_ip }}"
delegate_to: localhost
- name: Update config with new IP
ansible.builtin.lineinfile:
path: "{{ lookup('env', 'LINDERHOF_DIR') }}/group_vars/all/config.yml"
regexp: '^server_ip:'
line: "server_ip: {{ server_ip }}"
delegate_to: localhost
- name: Print server IP
ansible.builtin.debug:
msg: "Server '{{ server_name }}' provisioned at {{ server_ip }}"