The brief
A SaaS provider with two decades of operating history had its infrastructure configured almost entirely with Puppet. Their hosting provider was phasing out Puppet support, so the estate had to move to something that would be supported long-term. They picked Ansible.
What I did
I wrote all Ansible roles solo. Mail servers (Postfix), application servers, the jump-host and Postgres servers were all rebuilt against the new automation. Rollouts were set up so the customer could compare old and new side by side before switching traffic.
Most of the actual work was at the seams.
- Translating the Puppet resource model into idempotent Ansible tasks that produce the same end state without surprising the people running them.
- Standardising role layout and inventory so future engineers can find their way around quickly.
- Running deploys through Jenkins on every change, with roles stored in GitLab on-prem, to catch drift early and keep the delivery pipeline auditable.
In parallel with the config-management work, the application server fleet was redeployed RHEL7 to RHEL8/9 via blue-green, the same low-risk pattern used on the transport-sector Kubernetes migration the year before. Both sides run in parallel; traffic flips only when the new side is verified. The two tracks ran concurrently through the engagement.
Why it mattered
Two large migrations ran in parallel (Puppet to Ansible and a RHEL major redeploy) and both completed without incidents. Configuration management is rarely the headline, but it is the layer everything else relies on, and replacing it while keeping production running is most of the job.