# Retrieve VM templates available in Proxmox that match the specified name data "proxmox_virtual_environment_vms" "template" { filter { name = "name" values = ["${var.vm_template}"] # The name of the template to clone from } } # Create a cloud-init configuration file as a Proxmox snippet resource "proxmox_virtual_environment_file" "cloud_config" { content_type = "snippets" # Cloud-init files are stored as snippets in Proxmox datastore_id = "local" # Local datastore used to store the snippet node_name = var.node_name # The Proxmox node where the file will be uploaded 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 packages: - qemu-guest-agent # Ensures the guest agent is installed users: - default - name: ${var.vm_user} groups: sudo shell: /bin/bash ssh-authorized-keys: - "${var.vm_user_sshkey}" # Inject user's SSH key sudo: ALL=(ALL) NOPASSWD:ALL runcmd: - systemctl enable qemu-guest-agent - reboot # Reboot the VM after provisioning EOF } } # Define and provision a new VM by cloning the template and applying initialization resource "proxmox_virtual_environment_vm" "vm" { 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 = data.proxmox_virtual_environment_vms.template.vms[0].vm_id # ID of the source template node_name = data.proxmox_virtual_environment_vms.template.vms[0].node_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 = 4 # Disk size in GB } 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 = "vmbr0" # Use the default bridge vlan_id = var.vm_vlan # VLAN tagging if used } operating_system { type = "l26" # Linux 2.6+ kernel } vga { type = "std" # Standard VGA type } lifecycle { ignore_changes = [ # Ignore initialization section after first depoloyment for idempotency initialization ] } } # Output the assigned IP address of the VM after provisioning output "vm_ip" { value = proxmox_virtual_environment_vm.vm.ipv4_addresses[1][0] # Second network interface's first IP description = "VM IP" }