Remix.run Logo
matthiaswh 5 hours ago

I switched from Ansible to Pyinfra for my homelab, and continue to use Ansible at work.

The biggest difference is that Pyinfra is simply Python code. It's incredibly easy to control the system in whatever manner you need to. You can probably do the same thing in Ansible, but it's never quite as obvious how to do it. This also means it's much more clear where and why things work the way they do in Pyinfra, where in Ansible I end up digging through numerous role files to try to find where some variable gets injected.

bmurphy1976 2 hours ago | parent | next [-]

Just having "home/docker.py" instead of "collections/ansible_collections/home/dev/roles/docker/tasks/main.yml" is reason enough. Which one of the 300 main.yml files do I load when doing a quick open in any modern text editor?

SteveNuts 4 hours ago | parent | prev [-]

The worst part of Ansible is data manipulation, what would be an easy dictionary operation in Python is a huge mix of lookups in Ansible.

Incredibly frustrating that the data you want is right there but you can't easily grab it.

gchamonlive 4 hours ago | parent [-]

If Jinja templating for data manipulation gets too complex or inconvenient, you can create your own module in ansible and use python code for data manipulation. But at this point you are better served with plain python which I think is where pyinfra should shine. I want to take a look though at how hard it is to implement your own module for it.

matthiaswh 3 hours ago | parent [-]

If you're doing data manipulation with server state, you would probably want to create a Fact[0]. This is a straightforward Python class.

If you're doing data manipulation locally you would simply write Python code.

Operations[1] are Python functions which execute (yield) commands which will be run on hosts.

That's the gist of what it takes to write custom modules for Pyinfra.

[0] https://docs.pyinfra.com/en/3.x/api/facts.html [1] https://docs.pyinfra.com/en/3.x/api/operations.html