diff --git a/cloud-init/user-data-alpine.yml.tftpl b/cloud-init/user-data-alpine.yml.tftpl new file mode 100644 index 0000000..1148f5e --- /dev/null +++ b/cloud-init/user-data-alpine.yml.tftpl @@ -0,0 +1,52 @@ +#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} ] diff --git a/cloud-init/user-data.yml.tftpl b/cloud-init/user-data-systemd.yml.tftpl similarity index 76% rename from cloud-init/user-data.yml.tftpl rename to cloud-init/user-data-systemd.yml.tftpl index be76cc9..1d1ab1b 100644 --- a/cloud-init/user-data.yml.tftpl +++ b/cloud-init/user-data-systemd.yml.tftpl @@ -1,11 +1,11 @@ #cloud-config -# 1. Configuration du nom d'hôte de la machine +# 1. Hostname configuration hostname: ${hostname} fqdn: ${hostname} preserve_hostname: false -# 2. Création de l'utilisateur +# 2. User creation users: - name: ${username} sudo: ALL=(ALL) NOPASSWD:ALL @@ -14,16 +14,16 @@ users: ssh_authorized_keys: - ${ssh_key} -# 3. Mise à jour du système +# 3. System update package_update: true package_upgrade: true -# 4. Installation des paquets +# 4. Package installation packages: - qemu-guest-agent - curl -# 5. Installation et configuration de Tailscale +# 5. Tailscale installation and configuration runcmd: # Enable and start qemu-guest-agent (systemd) - [ systemctl, enable, qemu-guest-agent, --now ] diff --git a/terraform/prod/01-virtual-machines.tf b/terraform/prod/01-virtual-machines.tf index 3bc31e0..9eafcff 100644 --- a/terraform/prod/01-virtual-machines.tf +++ b/terraform/prod/01-virtual-machines.tf @@ -78,6 +78,11 @@ resource "proxmox_virtual_environment_vm" "vms" { # On utilise le bloc 'initialization' pour configurer Cloud-Init initialization { + # Configuration DNS (nécessaire au bootstrap : apt, curl, install Tailscale...) + dns { + servers = var.dns_servers + } + # Configuration IP ip_config { ipv4 { diff --git a/terraform/prod/02-cloud-init.tf b/terraform/prod/02-cloud-init.tf index 525c98a..9fa72ab 100644 --- a/terraform/prod/02-cloud-init.tf +++ b/terraform/prod/02-cloud-init.tf @@ -1,8 +1,18 @@ -# Fichier: terraform/prod/02-cloud-init.tf +# File: terraform/prod/02-cloud-init.tf locals { - # Utilise le contenu direct si fourni (CI), sinon lit depuis le fichier (local) + # Use direct content if provided (CI), otherwise read from file (local). ssh_public_key = var.admin_ssh_public_key != "" ? var.admin_ssh_public_key : file(var.admin_ssh_public_key_path) + + # OS -> cloud-init template family mapping. + # Selects the correct user-data based on init system / package manager. + os_template_family = { + ubuntu = "systemd" + debian = "systemd" + rocky = "systemd" + ipfabric = "systemd" + alpine = "alpine" + } } resource "proxmox_virtual_environment_file" "cloud_config" { @@ -13,18 +23,21 @@ resource "proxmox_virtual_environment_file" "cloud_config" { content_type = "snippets" source_raw { - data = templatefile("${path.module}/../../cloud-init/user-data.yml.tftpl", { - # Variables pour définir les informations de l'utilisateur - username = lookup(each.value, "username", var.default_vm_user) - ssh_key = local.ssh_public_key + data = templatefile( + "${path.module}/../../cloud-init/user-data-${local.os_template_family[each.value.os]}.yml.tftpl", + { + # User information + username = lookup(each.value, "username", var.default_vm_user) + ssh_key = local.ssh_public_key - # Variables pour définir les informations de la VM - hostname = "${each.key}.${var.domain_suffix}" + # VM information + hostname = "${each.key}.${var.domain_suffix}" - # Nouvelles variables pour Tailscale - vm_name = each.key # Le nom de la VM (ex: "web-01") - tailscale_auth_key = var.tailscale_auth_key - }) + # Tailscale variables + vm_name = each.key + tailscale_auth_key = var.tailscale_auth_key + } + ) file_name = "${each.key}-cloud-init.yml" } diff --git a/terraform/prod/variables.tf b/terraform/prod/variables.tf index 15a2649..6ccb9ec 100644 --- a/terraform/prod/variables.tf +++ b/terraform/prod/variables.tf @@ -54,6 +54,12 @@ variable "default_vm_user" { default = "root" } +variable "dns_servers" { + description = "Liste des serveurs DNS pour les VMs (utilisés au bootstrap, avant la prise en charge éventuelle par Tailscale ou un autre service)." + type = list(string) + default = ["192.168.1.254"] +} + variable "virtual_machines" { description = "Configuration des machines virtuelles à déployer" type = map(object({