Professional Services Configuration Management
Idempotent Ansible playbooks for a mixed Linux & FreeBSD fleet
A fleet of Ubuntu, Fedora, and FreeBSD hosts — including FreeBSD vnet jails — provisioned, patched, and hardened from version-controlled YAML instead of tribal knowledge. Hosts are grouped by package manager, each play runs the OS-correct module, and re-running a playbook changes nothing it shouldn't.
The approach
Every playbook lives in its own directory alongside the ansible.cfg
and inventory.ini that belong to it — so there's never any ambiguity about which
configuration goes with which playbook. The control machine reaches each host over SSH as an
unprivileged user and escalates with become/sudo on the target; you run
playbooks as yourself, never as root.
The fleet is deliberately heterogeneous, so a single package module can't cover it. Hosts are
grouped by package manager and each play targets the right tool — the apt
module on Ubuntu, dnf on Fedora, and the Python-independent raw
module driving pkg on FreeBSD (the jails ship without Python).
Fleet topology
The playbooks
| Playbook | Purpose | Changes the system? |
|---|---|---|
update-abba | Fully upgrade an Ubuntu host (cache, dist-upgrade, autoremove) and report whether a reboot is required | Yes (apt) |
check-updates | Report pending updates across the whole fleet — refreshes metadata and lists what would upgrade | No (read-only) |
update-lulu | Upgrade a FreeBSD host (pkgbase: base + kernel + ports) and its vnet jails, in the correct reboot order | Yes (pkg) |
install-build-tools | Install C/C++, CMake, make/gmake, and C# toolchains fleet-wide | Yes (installs packages) |
install-jenkins-client | Install Jenkins agent prerequisites — a Java JDK + git — on every node | Yes (installs packages) |
install-jenkins-controller | Install the Jenkins server (Java 21, LTS apt repo, service on :8080) on the controller | Yes (installs packages) |
Server provisioning & hardening, in practice
The provisioning playbooks bring a fresh host to a known-good state: install the right
packages and toolchains, set up the Jenkins agent prerequisites, and report cleanly on what
changed. The read-only check-updates playbook is the hardening companion — it
audits every host's pending security and package updates without touching a thing, grouping
output by OS so a long metadata refresh stays visible (async + poll)
instead of looking frozen. Unreachable hosts are reported in the play recap and never stop
the run.
Why it's safe to run
--check previews changes before they're applied.Dry-run first. Every changing playbook supports --check (and --limit to scope to a subset), so a change can be previewed on one host before it touches the fleet — and version control means every adjustment is reviewable in git.
The Jenkins controller and agents these playbooks install power the
CI/CD pipeline — see how a push to main
becomes a multi-OS build and release.
Want your servers described in code, not in your head?
Reproducible provisioning, fleet-wide patching, and hardening you can review in git — let's talk.