Initial commit: MAAS-deployable Proxmox VE images with cluster automation
Builds a Proxmox VE image that MAAS can deploy to bare metal, plus first-boot
automation that configures the node and joins it to a Proxmox cluster with no
manual steps.
The image starts from the official Debian cloud image and installs proxmox-ve
on top of it, rather than capturing a raw disk from the Proxmox ISO. That keeps
MAAS in control of partitioning, networking, SSH keys and cloud-init, and makes
moving between Proxmox releases a variable change instead of a rewrite.
Contents:
* Makefile driving the whole flow: build, verify, preseed, upload
* customize-proxmox.sh, run inside the Packer build VM, which layers Proxmox
onto the Debian cloud image and resets the pmxcfs node identity so one image
can produce many nodes
* pve-maas-init, a first-boot state machine covering /etc/hosts, node-unique
identifiers, the root password, vmbr0 conversion, cluster create/join and
the local-lvm thin pool; each stage is resumable across reboots
* curtin-hooks, which stops curtin installing a kernel over APT and pins
interface names by MAC so they match what MAAS recorded at commissioning
* a MAAS curtin preseed template and cloud-init examples
* deploy-cluster.sh, which builds a whole cluster through the MAAS API
* verify-image.sh, 22 static checks on the produced tarball
Cluster identity lives entirely in deploy-time cloud-init user-data, so a single
image and preseed can build any number of independent clusters.
Verified end to end against MAAS 3.7.2: proxmox-ve 9.2.0 / pve-manager 9.2.11 /
kernel 7.0.14-15-pve, deployed to two machines that formed a quorate cluster with
local-lvm on both, with no manual intervention.
The README documents four failure modes found along the way that all fail
silently: curtin rejecting "kernel: null", pvenetcommit overwriting the network
configuration at boot, interface renaming leaving the link down, and a systemd
ordering cycle that made systemd delete the service's start job.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
55
scripts/install-deps.sh
Executable file
55
scripts/install-deps.sh
Executable file
@@ -0,0 +1,55 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# install-deps.sh - Ubuntu 22.04+ build host'una packer-maas bagimliliklarini kurar.
|
||||
#
|
||||
# Kullanim: sudo ./scripts/install-deps.sh
|
||||
#
|
||||
set -euo pipefail
|
||||
|
||||
if [ "$(id -u)" -ne 0 ]; then
|
||||
echo "Bu script root olarak calistirilmali: sudo $0" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
. /etc/os-release
|
||||
if [ "${ID:-}" != "ubuntu" ] && [ "${ID_LIKE:-}" != "debian" ]; then
|
||||
echo "UYARI: Bu script Ubuntu/Debian icin yazildi (bulunan: ${PRETTY_NAME:-bilinmiyor})." >&2
|
||||
fi
|
||||
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
echo "==> Temel paketler kuruluyor"
|
||||
apt-get update
|
||||
apt-get install -y --no-install-recommends \
|
||||
ca-certificates curl gpg git make parted pigz jq \
|
||||
qemu-system-x86 qemu-utils ovmf cloud-image-utils \
|
||||
libnbd-bin nbdkit fuse2fs cpu-checker
|
||||
|
||||
echo "==> HashiCorp APT deposu ekleniyor (packer)"
|
||||
install -d -m 0755 /etc/apt/keyrings
|
||||
curl -fsSL https://apt.releases.hashicorp.com/gpg \
|
||||
| gpg --dearmor --yes -o /etc/apt/keyrings/hashicorp-archive-keyring.gpg
|
||||
chmod 0644 /etc/apt/keyrings/hashicorp-archive-keyring.gpg
|
||||
cat > /etc/apt/sources.list.d/hashicorp.list <<REPO
|
||||
deb [signed-by=/etc/apt/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com ${UBUNTU_CODENAME:-${VERSION_CODENAME}} main
|
||||
REPO
|
||||
|
||||
apt-get update
|
||||
apt-get install -y packer
|
||||
|
||||
echo "==> KVM kontrolu"
|
||||
if ! kvm-ok; then
|
||||
echo "HATA: KVM kullanilamiyor. VM'de nested virtualization acik mi? (Proxmox: cpu=host)" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Build root olarak kosuyor ama kullaniciyi da kvm grubuna alalim.
|
||||
TARGET_USER="${SUDO_USER:-}"
|
||||
if [ -n "$TARGET_USER" ] && [ "$TARGET_USER" != "root" ]; then
|
||||
adduser "$TARGET_USER" kvm >/dev/null 2>&1 || true
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "==> Hazir. Surumler:"
|
||||
packer version
|
||||
qemu-system-x86_64 --version | head -1
|
||||
Reference in New Issue
Block a user