pipeline-testing-improvements #9

Merged
torjus merged 7 commits from pipeline-testing-improvements into master 2026-02-01 16:45:04 +00:00
4 changed files with 52 additions and 74 deletions
Showing only changes of commit 21a32e0521 - Show all commits

1
.gitignore vendored
View File

@@ -10,4 +10,3 @@ terraform/terraform.tfvars
terraform/*.auto.tfvars terraform/*.auto.tfvars
terraform/crash.log terraform/crash.log
terraform/crash.*.log terraform/crash.*.log
terraform/.generated/

View File

@@ -1,55 +1,51 @@
# Cloud-init configuration for branch-specific bootstrap # Cloud-init configuration for all VMs
# #
# This file manages custom cloud-init snippets for VMs that need to bootstrap # This file manages cloud-init disks for all VMs using the proxmox_cloud_init_disk resource.
# from a specific git branch (non-master). Production VMs omit flake_branch # VMs with flake_branch set will include NIXOS_FLAKE_BRANCH environment variable.
# and use the default master branch.
# Generate cloud-init snippets for VMs with custom branch configuration resource "proxmox_cloud_init_disk" "ci" {
resource "local_file" "cloud_init_branch" { for_each = local.vm_configs
for_each = {
for name, vm in local.vm_configs : name => vm
if vm.flake_branch != null
}
filename = "${path.module}/.generated/cloud-init-${each.key}.yml" name = each.key
content = yamlencode({ pve_node = each.value.target_node
# Write NIXOS_FLAKE_BRANCH to /etc/environment storage = each.value.storage
# This will be read by bootstrap.nix service via EnvironmentFile
write_files = [{
path = "/etc/environment"
content = "NIXOS_FLAKE_BRANCH=${each.value.flake_branch}\n"
append = true
}]
})
file_permission = "0644" # User data includes SSH keys and optionally NIXOS_FLAKE_BRANCH
} user_data = <<-EOT
#cloud-config
# Upload cloud-init snippets to Proxmox ssh_authorized_keys:
# Note: This requires SSH access to the Proxmox host - ${each.value.ssh_public_key}
# Alternative: Manually copy files or use Proxmox API if available ${each.value.flake_branch != null ? <<-BRANCH
resource "null_resource" "upload_cloud_init" { write_files:
for_each = { - path: /etc/environment
for name, vm in local.vm_configs : name => vm content: |
if vm.flake_branch != null NIXOS_FLAKE_BRANCH=${each.value.flake_branch}
} append: true
BRANCH
# Trigger re-upload when content changes : ""}
triggers = {
content_hash = local_file.cloud_init_branch[each.key].content
}
# Upload the cloud-init file to Proxmox snippets directory
provisioner "local-exec" {
command = <<-EOT
scp -o StrictHostKeyChecking=no \
${local_file.cloud_init_branch[each.key].filename} \
${var.proxmox_host}:/var/lib/vz/snippets/cloud-init-${each.key}.yml
EOT EOT
}
depends_on = [local_file.cloud_init_branch] # Network configuration - static IP or DHCP
network_config = yamlencode({
version = 1
config = [{
type = "physical"
name = "ens18"
subnets = each.value.ip != null ? [{
type = "static"
address = each.value.ip
gateway = each.value.gateway
dns_nameservers = split(" ", each.value.nameservers)
dns_search = [each.value.search_domain]
}] : [{
type = "dhcp"
}]
}]
})
# Instance metadata
meta_data = yamlencode({
instance_id = sha1(each.key)
local-hostname = each.key
})
} }
# Ensure VMs depend on cloud-init being uploaded
# This is handled implicitly by the cicustom reference in vms.tf

View File

@@ -21,12 +21,6 @@ variable "proxmox_tls_insecure" {
default = true default = true
} }
variable "proxmox_host" {
description = "Proxmox host for SSH access (used to upload cloud-init snippets)"
type = string
default = "pve1.home.2rjus.net"
}
# Default values for VM configurations # Default values for VM configurations
# These can be overridden per-VM in vms.tf # These can be overridden per-VM in vms.tf

View File

@@ -104,8 +104,9 @@ resource "proxmox_vm_qemu" "vm" {
} }
ide { ide {
ide2 { ide2 {
cloudinit { # Reference the custom cloud-init disk created in cloud-init.tf
storage = each.value.storage cdrom {
iso = proxmox_cloud_init_disk.ci[each.key].id
} }
} }
} }
@@ -117,18 +118,6 @@ resource "proxmox_vm_qemu" "vm" {
# Agent # Agent
agent = 1 agent = 1
# Cloud-init configuration
ciuser = "root"
sshkeys = each.value.ssh_public_key
nameserver = each.value.nameservers
searchdomain = each.value.search_domain
# Network configuration - DHCP or static IP
ipconfig0 = each.value.ip != null ? "ip=${each.value.ip},gw=${each.value.gateway}" : "ip=dhcp"
# Custom cloud-init disk for branch configuration (if flake_branch is set)
cicustom = each.value.flake_branch != null ? "user=${each.value.storage}:snippets/cloud-init-${each.key}.yml" : null
# Skip IPv6 since we don't use it # Skip IPv6 since we don't use it
skip_ipv6 = true skip_ipv6 = true