locals { ipv4_addresses = flatten([ for server_key, server in var.server : [ for k, v in coalescelist(proxmox_virtual_environment_vm.server[server.name].ipv4_addresses, []) : v if length(regexall("^(lo|docker|veth).*", proxmox_virtual_environment_vm.server[server.name].network_interface_names[k])) == 0 ] ]) } locals { ipv6_addresses = flatten([ for server_key, server in var.server : [ for k, v in coalescelist(proxmox_virtual_environment_vm.server[server.name].ipv6_addresses, []) : v if length(regexall("^(lo|docker|veth).*", proxmox_virtual_environment_vm.server[server.name].network_interface_names[k])) == 0 ] ]) } resource "proxmox_virtual_environment_vm" "server" { for_each = { for row in var.server : row.name => row } name = "${each.value.name}.${try(each.value.dns_zone, var.server_dns_zone)}" description = try(each.value.description, null) tags = concat( [ "provisioner_terraform", "os_${each.value.os}", "zone_${each.value.zone}" ], [for service in try(each.value.services, []) : "service_${service}"], [for type in try(each.value.types, []) : "type_${type}"], try(each.value.labels, []) ) node_name = var.pve_node_name vm_id = each.value.vm_id on_boot = try(each.value.on_boot, true) reboot = try(each.value.reboot, false) scsi_hardware = "virtio-scsi-pci" keyboard_layout = try(each.value.keyboard_layout, var.server_keyboard_layout) agent { enabled = try(each.value.guest_agent, var.server_guest_agent) } cpu { type = try(each.value.cpu_type, "x86-64-v2-AES") cores = try(each.value.cpu_cores, 1) sockets = try(each.value.cpu_sockets, 1) } memory { dedicated = try(each.value.memory, 1024) floating = try(each.value.balloon, true) ? try(each.value.memory, 1024) : 0 } dynamic "disk" { for_each = concat( [{ size = 20, backup = true }], try(each.value.volumes, []) ) content { interface = "scsi${disk.key}" datastore_id = try(disk.value.datastore_id, var.server_datastore_id) path_in_datastore = "vm-${each.value.vm_id}-disk-${disk.key}" size = disk.value.size file_format = "raw" cache = "none" ssd = try(disk.value.ssd, false) discard = "on" } } network_device { model = "virtio" bridge = try(each.value.networks[0].bridge, var.server_network_bridge) vlan_id = try(each.value.networks[0].vlan_id, null) } operating_system { type = "l26" } clone { vm_id = each.value.clone_vm_id full = try(each.value.clone_full, true) } initialization { datastore_id = try(each.value.datastore_id, var.server_datastore_id) ip_config { ipv4 { address = try(each.value.networks[0].ipv4_address, "dhcp") gateway = try(each.value.networks[0].ipv4_gateway, null) } } user_account { keys = var.pve_ssh_keys username = "root" } } } resource "restapi_object" "ucs_server" { for_each = { for row in var.server : row.name => row } path = "/dns/host_record/" data = jsonencode({ "position" : var.ucs_zones[try(each.value.dns_zone, var.server_dns_zone)], "properties" : { "name" : each.value.name, "a" : concat(local.ipv4_addresses, local.ipv6_addresses), } }) }