Files
terraform-incus/modules/instance/main.tf
T
unkinben 4b9a6de83b
Build / build (pull_request) Failing after 11m25s
Dual-write ENC data into encapi alongside Cobbler
Seed encapi (statuses, roles, prodnxsr node assignments) and make the
instance module also create an encapi_node for every VM, so the k8s
puppetserver ENC can cut over from Cobbler. Cobbler/puppetca/puppetdb
resources are left untouched.

- Add config/encapi leaf + modules/encapi driving statuses/roles/nodes
  from YAML (3 statuses, 51 roles, 13 prodnxsr physical nodes).
- Add encapi_node to modules/instance (certname, role, environment).
- Wire encapi provider into root.hcl required_providers and the module
  providers; plumb ENCAPI_WRITE_TOKEN via Makefile vault_env.
2026-07-24 22:46:26 +10:00

151 lines
3.6 KiB
Terraform

module "storage_volume" {
source = "../../../../../../modules/storage_volume"
for_each = {
for k, v in var.storage_volumes : "${var.name}-${k}" => v
}
name = each.key
pool = each.value.pool
description = lookup(each.value, "description", null)
type = lookup(each.value, "type", "custom")
content_type = lookup(each.value, "content_type", null)
config = lookup(each.value, "config", {})
}
resource "incus_instance" "this" {
name = var.name
image = var.image
description = var.description
type = var.type
ephemeral = var.ephemeral
running = var.running
profiles = var.profiles
dynamic "wait_for" {
for_each = var.wait_for
content {
type = wait_for.value.type
nic = wait_for.value.nic
}
}
dynamic "device" {
for_each = var.disk_devices
content {
name = device.value.name
type = device.value.type
properties = {
path = device.value.properties["path"]
source = device.value.properties["source"]
pool = device.value.properties["pool"]
}
}
}
dynamic "device" {
for_each = {
for k, v in var.storage_volumes : k => {
name = k
path = v.path
pool = v.pool
source = "${var.name}-${k}"
}
}
content {
name = device.value.name
type = "disk"
properties = {
path = device.value.path
source = device.value.source
pool = device.value.pool
}
}
}
depends_on = [
module.storage_volume
]
}
resource "cobbler_system" "this" {
name = "${var.name}.${var.cobbler_domain}"
hostname = "${var.name}.${var.cobbler_domain}"
profile = var.cobbler_profile
status = "testing"
name_servers = var.cobbler_name_servers
mgmt_classes = var.cobbler_mgmt_classes
name_servers_search = ["${var.cobbler_domain}"]
interface {
name = "eth0"
mac_address = incus_instance.this.mac_address
static = true
ip_address = incus_instance.this.ipv4_address
netmask = var.cobbler_netmask
dns_name = "${var.name}.${var.cobbler_domain}"
gateway = local.gateway_ip
}
depends_on = [incus_instance.this]
}
resource "puppetdb_node" "this" {
certname = "${var.name}.${var.cobbler_domain}"
depends_on = [incus_instance.this]
}
# Dual-write the ENC assignment into encapi alongside the Cobbler system above.
# The role and environment must already exist in encapi (seeded by the
# config/encapi leaf); apply that leaf before the instance leaves.
resource "encapi_node" "this" {
certname = "${var.name}.${var.cobbler_domain}"
role = var.cobbler_mgmt_classes[0]
environment = var.encapi_environment
depends_on = [incus_instance.this]
}
resource "null_resource" "wait_for_instance_ready" {
depends_on = [incus_instance.this]
provisioner "local-exec" {
command = "sleep 10"
}
}
resource "puppetca_certificate" "cert" {
name = "${var.name}.${var.cobbler_domain}"
env = "production"
sign = false
depends_on = [
null_resource.wait_for_instance_ready
]
lifecycle {
create_before_destroy = false
}
}
#resource "puppetca_certificate" "cert" {
# count = (
# var.check_on_instance_creation ? 1 :
# (
# can(incus_instance.this.ipv4_address) && incus_instance.this.ipv4_address != "" ? 1 : 0
# )
# )
#
# name = "${var.name}.${var.cobbler_domain}"
# env = "production"
# sign = false
#
# depends_on = [incus_instance.this]
#
# lifecycle {
# create_before_destroy = false
# }
#}