locals { selected_instance = one([ for cfg in var.instance_configs : cfg if cfg.crispy_name == var.node_name ]) } resource "proxmox_virtual_environment_file" "cloud_config" { content_type = "snippets" datastore_id = "local" node_name = "pop" source_raw { file_name = "vm.cloud-config.yaml" # The name of the snippet file data = <<-EOF #cloud-config hostname: ${var.vm_name} package_update: true package_upgrade: true system_info: default_user: groups: [ docker ] users: - default - name: cloud groups: - sudo - docker shell: /bin/bash ssh-authorized-keys: - "${var.vm_user_sshkey}" # Inject user's SSH key sudo: ALL=(ALL) NOPASSWD:ALL packages: - qemu-guest-agent - apt-transport-https - ca-certificates - curl - gnupg - lsb-release - unattended-upgrades runcmd: - systemctl enable qemu-guest-agent - mkdir -p /etc/apt/keyrings - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg - echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null - apt-get update - apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin - systemctl enable docker - systemctl start docker - reboot EOF } } resource "proxmox_virtual_environment_vm" "ubuntu_22_minimal_clone" { name = var.vm_name # VM name node_name = var.node_name # Proxmox node to deploy the VM tags = var.vm_tags # Optional VM tags for categorization agent { enabled = true # Enable the QEMU guest agent } stop_on_destroy = true # Ensure VM is stopped gracefully when destroyed clone { vm_id = local.selected_instance.vmid # ID of the source template node_name = local.selected_instance.crispy_name # Node of the source template } bios = var.vm_bios # BIOS type (e.g., seabios or ovmf) machine = var.vm_machine # Machine type (e.g., q35) cpu { cores = var.vm_cpu # Number of CPU cores type = "host" # Use host CPU type for best compatibility/performance } memory { dedicated = var.vm_ram # RAM in MB } disk { datastore_id = var.node_datastore # Datastore to hold the disk interface = "scsi0" # Primary disk interface size = var.vm_size } initialization { user_data_file_id = proxmox_virtual_environment_file.cloud_config.id # Link the cloud-init file datastore_id = var.node_datastore interface = "scsi1" # Separate interface for cloud-init ip_config { ipv4 { address = "dhcp" # Get IP via DHCP } } } network_device { bridge = var.bridge # Use the default bridge } lifecycle { ignore_changes = [ # Ignore initialization section after first depoloyment for idempotency initialization ] } }