Pyinfra
Pyinfra
Pyinfra e uno strumento open source di automazione e deploy infrastrutturale scritto in Python. Può essere usato sia per comandi ad-hoc sia per deploy ripetibili definiti in file Python versionabili in Git.
Concetto base
Pyinfra lavora con due elementi principali:
- Inventory: host, gruppi e dati associati agli host.
- Operations: stato desiderato o comandi da applicare ai target.
L'approccio e vicino ad Ansible sul piano operativo, ma invece di descrivere i deploy soprattutto in YAML, pyinfra usa Python.
Come funziona
Secondo la documentazione ufficiale, l'esecuzione avviene in cinque fasi:
- lettura di inventory e data
- connessione ai target
- preparazione con rilevamento cambiamenti e ordine operazioni
- esecuzione delle modifiche
- disconnessione e cleanup
Un punto importante e che pyinfra prepara prima l'ordine delle operazioni e poi le esegue. Questo permette di mantenere l'ordine logico delle operazioni, eseguendo ogni singola operation in parallelo sui target rilevanti.
Inventory
Un inventory pyinfra contiene:
- host
- gruppi
- dati di gruppo
- dati per singolo host
Esempio minimale:
web_servers = [
"web-01.example.net",
"web-02.example.net",
]
db_servers = [
("db-01.example.net", {"install_postgres": True}),
]
I dati associati agli host o ai gruppi possono essere usati nel deploy Python tramite `host.data`.
Operations
Le operations descrivono cosa deve essere vero sul sistema target. In molti casi non rappresentano un'azione imperativa ma uno stato desiderato.
Esempio:
from pyinfra.operations import apt, files
apt.packages(
name="Install vim",
packages=["vim"],
update=True,
)
files.file(
name="Ensure log file exists",
path="/var/log/app.log",
user="app",
group="app",
mode="644",
)
Se il target e gia nello stato richiesto, pyinfra non applica cambiamenti ulteriori.
Comandi ad-hoc
Pyinfra puo essere usato anche direttamente da CLI senza creare un deploy completo.
Esempi:
pyinfra @local exec -- echo "hello world" pyinfra my-server.net exec -- uptime pyinfra @docker/ubuntu:22.04 exec -- uname -a
Esempio base di deploy
Inventory:
my_hosts = [
("ubuntu2204", {
"ssh_port": 2222,
"ssh_hostname": "localhost",
"ssh_user": "vagrant",
"_sudo": True,
}),
"my-server.net",
]
Deploy:
from pyinfra.operations import apt
apt.packages(
name="Ensure vim is installed",
packages=["vim"],
update=True,
)
Esecuzione:
pyinfra inventory.py deploy.py
Differenze pratiche rispetto ad Ansible
- usa Python invece di fare affidamento principalmente su YAML
- e comodo per chi vuole logica, condizioni e riuso direttamente nel linguaggio
- mantiene il modello inventory + operazioni + stato desiderato
- puo essere piu naturale per team che preferiscono automazione programmabile piuttosto che playbook dichiarativi
Quando ha senso usarlo
- homelab e server Linux
- provisioning e configurazioni ripetibili
- deploy gestiti in Git
- ambienti dove Python e gia parte del flusso operativo
Limiti da tenere presenti
- richiede maggiore familiarita con Python rispetto a strumenti piu dichiarativi
- alcuni team preferiscono YAML per leggibilita immediata lato operations
- va progettato con attenzione quando la logica dipende da fatti che possono cambiare durante il deploy
Installazione
Secondo la documentazione ufficiale, il metodo consigliato e:
uv tool install pyinfra pyinfra --version
Alternative supportate: `pipx` oppure `pip` in virtual environment.