Adopt Packer + Cloud-Init for VM Template Standardization¶
Status¶
Accepted — Packer is the standard for building immutable VM templates on Proxmox; cloud-init is the default initialization system.
Context¶
Manual template builds via Proxmox UI cause configuration drift, lack auditability, and scale poorly. We require repeatable golden images that integrate with Terraform (provisioning) and Ansible (configuration management).
Decision¶
Use HashiCorp Packer (Proxmox ISO builder) to produce cloud-init-ready templates for: - Linux: Ubuntu 22.04/24.04 LTS, Rocky Linux 9/10 - Windows: Server 2022/2025, Windows 11 Enterprise (via Cloudbase-Init)
Templates are version-controlled in Git and rebuilt on a monthly cadence or when CVEs require patches.
Prerequisite: Enterprise network infrastructure per ADR-0015 (DHCP on management network, DNS, outbound access).
Principles¶
- Immutable images — Rebuild for changes; no in-place modifications
- Declarative — HCL configuration in Git with review trails
- Separation of concerns — Packer builds → Terraform provisions → Ansible configures
- Cloud-init first — Environment specifics applied at clone time
- VMID auto-increment — Conflicts resolved automatically during builds
Scope¶
In-scope: - Full VMs requiring bootable OS images (control nodes, RKE2 nodes, Linux/Windows servers) - Automated builds with evidence generation - Chain ID tracking for audit correlation
Out-of-scope: - LXC containers (see ADR-0018 – LXC Containers for Lightweight Workloads) - Application-layer configuration - Runtime network design (VLANs, SDN) - Docker/OCI images
Consequences¶
Positive¶
- Repeatable, auditable builds with <5% drift rate
- 80% reduction in template build time vs manual UI
- Consistent hardening baselines across all images
- Full audit trail via chain IDs and evidence artifacts
Negative¶
- Team must learn Packer HCL and plugin specifics
- Build pipeline adds <10 minutes per template
- Requires template storage management and retention policies
Implementation Notes¶
- Packer HCL lives in
infra/packer-multi-os/ - Provisioning toolkit (init, wrapper, evidence, unattended rendering) lives in
control/tools/provision/packer/(bin/andremote/) - Proxmox API environment is written to
infra/env/proxmox.credentials.tfvarsviacontrol/tools/provision/init/init-proxmox-env.sh - Evidence and logs are written under:
output/logs/packer/…output/artifacts/platform/onprem/proxmox/packer/…- Chain IDs from
chain-lib.share used to correlate init logs, build logs and proof artifacts
Metrics & Review Triggers¶
- Success rate: ≥95%
- Build time: <10min per template
- Cloud-init success: ≥99%
- Review triggers: Proxmox major upgrades, plugin API changes, failure rate >10%
Alternatives Considered¶
| Option | Rejected Because |
|---|---|
| Manual UI builds | Configuration drift, no audit trail, slow |
| Ansible-only provisioning | Not immutable, slower, blurs layer separation |
| Terraform-only OS installs | Not designed for OS installation phase |
| Cloud-init without golden images | Slow per-VM provisioning, inconsistent baselines |
| LXC-only architecture | Insufficient isolation for security/kernel requirements |
References¶
- Prerequisite: ADR-0015 — Network Infrastructure Assumptions
- Operations: Runbook — Proxmox VM Template Build
- Learning: HOWTO — Build Your First Packer Template
- Toolkit: Packer Provisioning Toolkit README
- Evidence: Run artefacts & logs
External: - HashiCorp Packer Documentation - Packer Proxmox Plugin - Proxmox VE API - cloud-init Documentation
Maintainer: HybridOps.Studio License: MIT-0 for code, CC-BY-4.0 for documentation unless otherwise stated.