Tooling

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 runcmd script 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-localds or 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.

On this page