locals { ansible_repo_path = var.ansible_repo_path != "" ? var.ansible_repo_path : "${path.module}/../ansible" } resource "proxmox_vm_qemu" "vm" { for_each = var.vms agent = 1 skip_ipv6 = true vmid = each.value.vmid name = each.value.name target_node = each.value.target_node clone = each.value.template onboot = each.value.onboot os_type = "other" cpu { type = "host" numa = true cores = each.value.cores sockets = each.value.sockets } memory = each.value.memory balloon = 0 scsihw = "virtio-scsi-pci" bootdisk = "scsi0" disk { slot = "scsi0" type = "disk" storage = each.value.disk_storage size = each.value.disk_size format = "qcow2" discard = true } network { id = 0 bridge = each.value.bridge model = "virtio" macaddr = each.value.macaddr tag = each.value.vlan != 0 ? each.value.vlan : null } lifecycle { ignore_changes = [ usb, ] } serial { id = 0 } tags = length(each.value.tags) > 0 ? join(",", each.value.tags) : null } resource "null_resource" "wait_for_ssh" { for_each = var.vms depends_on = [proxmox_vm_qemu.vm] connection { type = "ssh" host = each.value.ip user = "ansible" private_key = file("~/.ssh/auto") timeout = "5m" } provisioner "local-exec" { command = </dev/null 2>&1; then echo "✅ SSH is up!" exit 0 fi echo "Retry $i: SSH not ready yet..." sleep 10 done echo "❌ SSH did not become available on ${each.value.ip} after timeout." exit 1 EOT } } resource "local_file" "host_tags" { for_each = var.vms content = templatefile("${path.module}/host_tags.yml.tpl", { vmid = each.value.vmid name = each.value.name target_node = each.value.target_node template = each.value.template cores = each.value.cores sockets = each.value.sockets memory = each.value.memory bridge = each.value.bridge macaddr = each.value.macaddr disk_size = each.value.disk_size disk_storage = each.value.disk_storage ip = each.value.ip vlan = each.value.vlan tags = each.value.tags }) filename = "${local.ansible_repo_path}/host_vars/${each.value.name}/host_tags.yml" }