Files
homelab/terraform/main.tf

147 lines
3.7 KiB
HCL

resource "proxmox_virtual_environment_download_file" "talos_iso" {
content_type = "iso"
datastore_id = "local"
node_name = "pve"
# Factory image with QEMU guest agent + i915 (Intel iGPU) extensions
# Schematic: aa948be975ffec096205160edd988ee6d949d72c20a39ca5844fc0a2a3fc8415
url = "https://factory.talos.dev/image/aa948be975ffec096205160edd988ee6d949d72c20a39ca5844fc0a2a3fc8415/v1.12.5/metal-amd64.iso"
file_name = "talos-v1.12.5-factory-metal-amd64.iso"
lifecycle {
prevent_destroy = true
}
}
resource "proxmox_virtual_environment_vm" "talos-vm" {
for_each = var.clusters
name = "talos-${each.key}-node0"
tags = ["terraform", "talos", each.key]
node_name = "pve"
on_boot = true
bios = "ovmf"
machine = "i440fx"
boot_order = ["scsi0", "ide3"]
cpu {
cores = each.value.cores
type = "host"
}
memory {
dedicated = each.value.memory
}
agent {
enabled = true
type = "virtio"
}
network_device {
mac_address = each.value.mac_address
firewall = false
}
cdrom {
interface = "ide3"
file_id = proxmox_virtual_environment_download_file.talos_iso.id
}
disk {
interface = "scsi0"
size = each.value.disk_size_gb
datastore_id = each.value.datastore_id
aio = "io_uring"
cache = "none"
discard = "on"
ssd = true
}
efi_disk {
datastore_id = each.value.datastore_id
pre_enrolled_keys = false
}
dynamic "hostpci" {
for_each = each.value.gpu_mapping != null ? [each.value.gpu_mapping] : []
content {
device = "hostpci0"
mapping = hostpci.value
}
}
serial_device {
device = "socket"
}
}
resource "talos_machine_secrets" "secrets" {
for_each = var.clusters
}
data "talos_machine_configuration" "machine-config" {
for_each = var.clusters
cluster_name = "talos-${each.key}"
machine_type = "controlplane"
cluster_endpoint = "https://${each.value.hostname}:6443"
machine_secrets = talos_machine_secrets.secrets[each.key].machine_secrets
config_patches = [
yamlencode({
cluster = {
allowSchedulingOnControlPlanes = true
}
})
]
}
resource "talos_machine_configuration_apply" "talos-config" {
depends_on = [proxmox_virtual_environment_vm.talos-vm]
for_each = var.clusters
node = each.value.hostname
client_configuration = talos_machine_secrets.secrets[each.key].client_configuration
machine_configuration_input = data.talos_machine_configuration.machine-config[each.key].machine_configuration
}
resource "talos_machine_bootstrap" "talos-bootstrap" {
depends_on = [talos_machine_configuration_apply.talos-config]
for_each = var.clusters
node = each.value.hostname
client_configuration = talos_machine_secrets.secrets[each.key].client_configuration
}
data "talos_cluster_health" "talos-health" {
depends_on = [talos_machine_bootstrap.talos-bootstrap]
for_each = var.clusters
client_configuration = talos_machine_secrets.secrets[each.key].client_configuration
control_plane_nodes = [each.value.ip_address]
endpoints = [each.value.hostname]
}
data "talos_client_configuration" "talos-client-config" {
depends_on = [data.talos_cluster_health.talos-health]
for_each = var.clusters
cluster_name = each.key
client_configuration = talos_machine_secrets.secrets[each.key].client_configuration
nodes = [each.value.ip_address]
}
resource "talos_cluster_kubeconfig" "talos-kubeconfig" {
depends_on = [data.talos_cluster_health.talos-health]
for_each = var.clusters
client_configuration = talos_machine_secrets.secrets[each.key].client_configuration
node = each.value.ip_address
}