locals { domain = "ingress.tjo.cloud" nodes = { for k, v in var.nodes : k => merge(v, { id = 700 + index(keys(var.nodes), k) hash = sha1(v.name) mac_address = "AA:BB:07:00:${format("%v:%v", substr(sha1(v.name), 0, 2), substr(sha1(v.name), 2, 2))}" domain = local.domain }) } } resource "proxmox_virtual_environment_download_file" "ubuntu" { content_type = "iso" datastore_id = var.common_storage node_name = var.nodes[keys(var.nodes)[0]].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 = var.common_storage source_raw { data = <<-EOF #cloud-config hostname: ${each.value.name}.${each.value.domain} write_files: - path: /etc/tjo.cloud/meta.json encoding: base64 content: ${base64encode(jsonencode({ name : each.value.name, domain : each.value.domain }))} ssh_authorized_keys: ${jsonencode(var.ssh_keys)} packages: - qemu-guest-agent power_state: mode: reboot EOF file_name = "${each.value.name}.ingress.tjo.cloud.userconfig.yaml" } } resource "proxmox_virtual_environment_vm" "nodes" { for_each = local.nodes vm_id = each.value.id name = "${each.value.name}.${each.value.domain}" node_name = each.value.host description = "Node ${each.value.name} for ${each.value.domain}." tags = [each.value.domain] stop_on_destroy = true timeout_start_vm = 60 timeout_stop_vm = 60 timeout_shutdown_vm = 60 timeout_reboot = 60 timeout_create = 600 cpu { cores = each.value.cores type = "host" } memory { dedicated = each.value.memory } bios = "ovmf" efi_disk { datastore_id = each.value.storage } operating_system { type = "l26" } agent { enabled = true } network_device { bridge = each.value.bridge mac_address = each.value.mac_address } scsi_hardware = "virtio-scsi-single" disk { file_id = proxmox_virtual_environment_download_file.ubuntu.id interface = "virtio0" datastore_id = each.value.storage size = each.value.boot_size backup = true cache = "none" iothread = true } initialization { interface = "scsi0" datastore_id = each.value.storage user_data_file_id = proxmox_virtual_environment_file.userdata[each.key].id ip_config { ipv4 { address = "dhcp" } ipv6 { address = "dhcp" } } } }