Merge pull request 'fenix-admin' (#140) from fenix-admin into main

Reviewed-on: fenix-gitea-admin/iac-teste#140
This commit is contained in:
2025-08-26 17:06:35 +00:00
3 changed files with 97 additions and 54 deletions

20
cloud-init-base.yaml Normal file
View File

@ -0,0 +1,20 @@
locale: "pt_PT.UTF-8"
keyboard:
layout: "pt"
variant: "nodeadkeys"
#cloud-config
users:
- default
ssh_pwauth: true
package_update: true
packages:
- qemu-guest-agent
- net-tools
- curl
runcmd:
- systemctl enable qemu-guest-agent
- systemctl start qemu-guest-agent
- echo "done" > /tmp/cloud-config.done

31
cloud-init-vm.yaml.tftpl Normal file
View File

@ -0,0 +1,31 @@
#cloud-config
package_update: true
packages:
%{ for pkg in each.value.extra_packages ~}
- ${pkg}
%{ endfor ~}
users:
%{ if length(each.value.extra_users) > 0 ~}
%{ for u in each.value.extra_users ~}
- name: ${u.name}
groups: [${join(", ", u.groups)}]
shell: /bin/bash
sudo: ALL=(ALL) NOPASSWD:ALL
%{ endfor ~}
chpasswd:
list: |
%{ for u in each.value.extra_users ~}
${u.name}:${u.password}
%{ endfor ~}
expire: false
%{ endif ~}
runcmd:
%{ if length(each.value.extra_runcmd) > 0 ~}
%{ for cmd in each.value.extra_runcmd ~}
- ${cmd}
%{ endfor ~}
%{ endif ~}

View File

@ -30,28 +30,7 @@ resource "proxmox_virtual_environment_file" "cloud_init_yaml" {
source_raw {
file_name = "user-data-cloud-config.yaml"
data = <<-EOF
locale: "pt_PT.UTF-8"
keyboard:
layout: "pt"
variant: "nodeadkeys"
#cloud-config
users:
- default
ssh_pwauth: true
package_update: true
packages:
- qemu-guest-agent
- net-tools
- curl
runcmd:
- systemctl enable qemu-guest-agent
- systemctl start qemu-guest-agent
- echo "done" > /tmp/cloud-config.done
EOF
data = yamldecode(file("${path.module}/cloud-init-base.yaml"))
}
}
@ -59,47 +38,60 @@ resource "proxmox_virtual_environment_file" "cloud_init_yaml" {
# Gerar um snippet cloud-init por VM
resource "proxmox_virtual_environment_file" "vm_user_data" {
for_each = { for vm in var.proxmox_k8s_vms : vm.name => vm }
for_each = local.merged_cloudinit
node_name = "fenix"
datastore_id = "local-snippets"
content_type = "snippets"
source_raw {
file_name = "cloud-init-iac-k8s-${each.value.name}.yaml"
data = <<-EOF
#cloud-config
package_update: true
packages:
%{ for pkg in each.value.extra_packages ~}
- ${pkg}
%{ endfor ~}
file_name = "cloud-init-iac-k8s-${each.key}.yaml"
data = yamlencode(each.value)
}
}
users:
%{ if length(each.value.extra_users) > 0 ~}
locals {
# Lê o ficheiro base (que está no mesmo módulo)
base_cloudinit = yamldecode(file("${path.module}/cloud-init-base.yaml"))
%{ for u in each.value.extra_users ~}
- name: ${u.name}
groups: [${join(", ", u.groups)}]
shell: /bin/bash
sudo: ALL=(ALL) NOPASSWD:ALL
%{ endfor ~}
# Renderiza cada ficheiro por VM
vm_cloudinits = {
for vm in var.proxmox_k8s_vms : vm.name => yamldecode(
templatefile("${path.module}/cloud-init-vm.yaml.tftpl", {
hostname = vm.hostname
extra_packages = try(vm.extra_packages, [])
extra_users = try(vm.extra_users, [])
extra_runcmd = try(vm.extra_runcmd, [])
})
)
}
chpasswd:
list: |
%{ for u in each.value.extra_users ~}
${u.name}:${u.password}
%{ endfor ~}
expire: false
# Função recursiva para deep merge
deep_merge = function("deep_merge", [map(string), map(string)], map(string), <<EOT
base, override = args
result = {}
for k in setunion(keys(base), keys(override)) {
if can(base[k]) && can(override[k]) {
if type(base[k]) == list && type(override[k]) == list {
result[k] = concat(base[k], override[k])
} else if type(base[k]) == map && type(override[k]) == map {
result[k] = deep_merge(base[k], override[k])
} else {
result[k] = override[k]
}
} else if can(override[k]) {
result[k] = override[k]
} else {
result[k] = base[k]
}
}
return result
EOT)
%{ endif ~}
runcmd:
%{ if length(each.value.extra_runcmd) > 0 ~}
%{ for cmd in each.value.extra_runcmd ~}
- ${cmd}
%{ endfor ~}
%{ endif ~}
EOF
# Resultado final = deep merge do base + vm
merged_cloudinit = {
for vm_name, vm_cfg in local.vm_cloudinits :
vm_name => local.deep_merge(local.base_cloudinit, vm_cfg)
}
}