#cloud-config # 1. Hostname configuration hostname: ${hostname} fqdn: ${hostname} preserve_hostname: false # 2. User creation # On Alpine, the privilege escalation group is "wheel" (not "sudo"). # Keep the default shell (ash/busybox) to stay lightweight. users: - name: ${username} sudo: ALL=(ALL) NOPASSWD:ALL groups: wheel ssh_authorized_keys: - ${ssh_key} # 3. apk repositories configuration # Pin the two repositories used on this homelab: edge/main + edge/community. # Written BEFORE package_update/package_upgrade so apk uses this config immediately. write_files: - path: /etc/apk/repositories owner: root:root permissions: '0644' content: | http://dl-cdn.alpinelinux.org/alpine/edge/main http://dl-cdn.alpinelinux.org/alpine/edge/community # 4. System update (apk) package_update: true package_upgrade: true # 5. Package installation # - qemu-guest-agent: main repo (required so Proxmox/Terraform can read the VM IP) # - tailscale: community repo packages: - qemu-guest-agent - curl - sudo - tailscale # 6. Services & configuration (OpenRC, not systemd) # Intentional order: qemu-guest-agent first to unblock Terraform as soon as possible. runcmd: # Enable and start qemu-guest-agent via OpenRC - [ rc-update, add, qemu-guest-agent, default ] - [ rc-service, qemu-guest-agent, start ] # Enable and start Tailscale via OpenRC - [ rc-update, add, tailscale, default ] - [ rc-service, tailscale, start ] # Register the node with the tailnet - [ tailscale, up, --authkey=${tailscale_auth_key}, --hostname=${vm_name} ]