ingress/terraform/node.tf

113 lines
2.7 KiB
HCL

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:
- htop
- git
- qemu-guest-agent
run_cmd:
- systemctl enable --now qemu-guest-agent
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"
}
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"
}
}
}
}