First boot only. For ongoing changes you still need something else, but sarahjey said provisioning. Most people conflate the two.
What do you use for automated server provisioning without Ansible?
To clarify my framework: rollback is manual. I snapshot /etc and /usr/local before apply, restore via rsync if needed. Not atomic, but has saved me twice in eight years.
Manual rollback is still better than my for-loop disaster lol. I ended up just going with Ansible for the 5 boxes, took an afternoon to learn enough YAML.
Make handles rollback fine if you write uninstall targets. People just dont bother.
I use pyinfra for my three VPS boxes. Python but no agent, just SSH like Ansible. Feels lighter because its pure Python, no Jinja2 YAML soup.
Pyinfra looks interesting. Is the Python dep a problem on stock Debian?
Debian 12 ships Python 3.11. Pyinfra installs via pip, no issue. I deploy nginx, ufw, my user keys. 40 lines of Python vs 80 of YAML for same result.
I finally escaped shared hosting in 2025 and went straight to Hetzner with their installimage. Not automation exactly but one reinstall script and I am back online in 8 minutes. For three boxes that is enough.
Used to hand-roll Kickstart then iPXE for our DSLAM management boxes. For three hosts I would not bother with any framework. Git repo of configs, scp and ssh, 20 minute job once a quarter.
For three boxes in EU I would check if your provider has an API for reinstall with post-install script. OVHcloud does this, Hetzner too. The automation lives at the provider, not on your machine.