Cloud-init & Bare-Metal Provisioning
First-boot configuration for VMs, and PXE-style bare-metal bootstrap.
Cloud-init (the universal first-boot)
- ★ cloud-init — the de-facto standard. Reads YAML user-data on first boot and configures users / packages / SSH keys / networks / scripts. Supported by every major cloud (AWS, GCP, Azure, Hetzner, DO, Vultr, etc.) and most VPS providers.
- ★ Ignition — Fedora CoreOS / Flatcar / Talos first-boot config. JSON-based, immutable-OS-flavored.
- Tinkerbell — open-source bare-metal provisioning (formerly EquinixMetal); modern PXE replacement.
- Subiquity — Ubuntu's curtin-based installer; consumes cloud-init.
- Kickstart — Fedora / RHEL classic.
- Preseed — Debian / Ubuntu classic.
What cloud-init typically does
- Set hostname.
- Add users + SSH keys.
- Install initial packages.
- Drop SSH host keys / config.
- Mount disks / format.
- Run a
runcmdscript for whatever cloud-init can't do directly. - Hand control off to Ansible for ongoing config.
Bare-metal / PXE-era tools
- ★ MAAS (Canonical) — Metal-as-a-Service; web UI to discover, image, and lifecycle bare metal.
- ★ Tinkerbell — modern PXE-replacement; image bare metal via API. Used by Equinix Metal.
- Foreman — older bare-metal provisioning tool; integrates with Puppet.
- Cobbler — older Red Hat tool; still around for kickstart-driven environments.
- FAI (Fully Automatic Installation) — Debian-flavored.
- Razor — older Puppet-era.
VM / lab provisioning (local)
- ★ Vagrant — local VM provisioning; VirtualBox / Parallels / libvirt / Hyper-V backends. Fading slightly but still common.
- ★ multipass — Canonical's lightweight Ubuntu VM CLI; great for "spin up a real Ubuntu in 10 seconds."
- Lima — Linux VMs on Mac for development; the foundation under Colima.
- Colima — Docker / k8s on Mac via Lima; lightweight Docker Desktop alternative.
- OrbStack — Docker / Linux VMs on Mac; fastest, cleanest, paid for commercial use.
- Proxmox VE — for actual hypervisor labs; see Homelab.
Image baking pipelines
- See Image Building — Packer is the typical "bake the image so cloud-init only has to do the last 5%" tool.
Patterns to adopt
- ★ Bake what changes rarely; cloud-init what changes per-host. Don't put your app deploy in cloud-init — put the agent that pulls deploys.
- Test user-data locally with
cloud-localdsor LXD before booting cloud VMs. - Combine cloud-init + Ansible: cloud-init bootstraps Ansible (drops SSH key, installs Python), Ansible takes over for everything else.
- Use immutable OSes (Talos, Flatcar, Bottlerocket) when you want declarative, non-drifting hosts.
- PXE chainload iPXE for fast, scriptable, modern boot environments.
Pick this if…
- Default cloud-VM bootstrap: cloud-init + Ansible takeover.
- Bare-metal fleet: MAAS or Tinkerbell.
- Immutable OS first-boot: Ignition (CoreOS / Flatcar / Talos).
- Local dev VMs: multipass (Mac), Lima / OrbStack (Mac with Docker), Vagrant (cross-platform).
- Building images instead of provisioning live: Packer.