locals { domain = "ingress.tjo.cloud" nodes = { for k, v in var.nodes : k => merge(v, { id = 800 + index(keys(var.nodes), k) hash = sha1(v.host) mac_address = "AA:BB:07:00:${format("%v:%v", substr(sha1(v.host), 0, 2), substr(sha1(v.host), 2, 2))}" domain = local.domain meta = { name = v.host domain = local.domain service_account = { username = authentik_user.service_account[k].username password = authentik_token.service_account[k].key } } }) } ipv4_addresses = { for key, node in local.nodes : key => { for k, v in proxmox_virtual_environment_vm.nodes[key].ipv4_addresses : proxmox_virtual_environment_vm.nodes[key].network_interface_names[k] => v } } } resource "proxmox_virtual_environment_download_file" "ubuntu" { for_each = local.nodes content_type = "iso" datastore_id = each.value.iso_storage node_name = each.value.host url = "https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img" overwrite = false } resource "proxmox_virtual_environment_file" "userdata" { for_each = local.nodes node_name = each.value.host content_type = "snippets" datastore_id = each.value.iso_storage source_raw { data = <<-EOF #cloud-config hostname: ${each.value.host}.${each.value.domain} write_files: - path: /etc/tjo.cloud/meta.json encoding: base64 content: ${base64encode(jsonencode(each.value.meta))} ssh_authorized_keys: ${jsonencode(var.ssh_keys)} packages: - qemu-guest-agent power_state: mode: reboot EOF file_name = "${each.value.host}.ingress.tjo.cloud.userconfig.yaml" } } resource "proxmox_virtual_environment_vm" "nodes" { for_each = local.nodes vm_id = each.value.id name = "${each.value.host}.${each.value.domain}" node_name = each.value.host description = <