- Escreva tarefas de automação de servidores em código Python e execute em paralelo via SSH, realizando comandos de forma idempotente sem agentes
- O pyinfra destaca ser 6 vezes mais rápido que o Ansible na mesma carga de trabalho, usando execução concorrente baseada em gevent e SSH
- Com a opção
--dry, é possível verificar o diff de mudanças por host antes da aplicação, e na execução real os resultados retornam em streaming paralelo - Os hosts de destino precisam apenas de shell e SSH, sem daemon, arquivos de estado ou control plane
- Enfatiza uma configuração centrada em código que usa diretamente loops e condicionais do Python, em vez de codificar o fluxo de controle em YAML
Recursos principais e fluxo de execução
-
Automação para milhares de servidores
- pyinfra é uma ferramenta de automação agentless, nativa de Python, que executa comandos via SSH
- A execução de comandos enfatiza concorrência, idempotência e velocidade, destacando ser 6 vezes mais rápido que o Ansible na mesma carga de trabalho
- O comando de instalação é
$ uv tool install pyinfra - Os pré-requisitos básicos indicados são licença MIT, Python 3.10 ou superior, sem agentes e configuração zero
-
Exemplo de código de deploy
- As operações
apt,filesesystemdsão importadas em código Python para instalar pacotes, aplicar templates e recarregar serviços - O código de exemplo instala os pacotes
nginxecertbote aplicatemplates/nginx.conf.j2em/etc/nginx/sites-enabled/api - Na etapa final, recarrega o serviço
nginxcomsystemd.service("nginx", reloaded=True)
from pyinfra.operations import apt, files, systemd apt.packages( packages=["nginx", "certbot"], update=True, ) files.template( src="templates/nginx.conf.j2", dest="/etc/nginx/sites-enabled/api", ) systemd.service("nginx", reloaded=True) - As operações
-
Inventário e resultados de execução
- O exemplo de inventário organiza hosts web de
web-01.prodatéweb-23.prod, além dos hosts de banco de dadosdb-01.prodedb-02.prod - O comando
$ pyinfra inventory.py deploy.py --limit webexecuta apenas sobre os alvos limitados aweb - A saída de execução segue a ordem de carregamento do inventário, coleta concorrente de facts, execução de
deploy.pye resumo - O resumo do exemplo registra sucesso em 23 hosts, 18 alterados, 0 falhas e total de 2,1 segundos
- O exemplo de inventário organiza hosts web de
-
Verificação antes das mudanças
--drypermite verificar antes todas as diffs por host das operações que o pyinfra executará- Na execução real, os resultados são transmitidos em paralelo, mostrando o número de mudanças e o tempo de execução de cada host
- O exemplo registra, em 24 hosts, 18 alterados, 6 sem mudanças, 0 falhas e total de 2,1 segundos
Características, comparação com Ansible e princípios
-
Seis motivos para escolher pyinfra
- Just Python: escreve o fluxo de controle real em Python, sem YAML e sem Jinja dentro de YAML
- Concurrent SSH: executa concorrentemente com base em gevent e SSH, sendo 6 vezes mais rápido que o Ansible na mesma carga de trabalho
- Diff before apply: com
--dry, mostra todas as mudanças antecipadamente, e operações idempotentes viram no-op em reexecuções - 0 agents: os hosts precisam apenas de shell e SSH, sem daemon, arquivos de estado ou control plane
- Scale-ready: funciona de 1 a 10.000 hosts, com execução paralela e saída em streaming em tempo real
- Hackable: permite criar operações customizadas em 10 linhas e conectar com docker, lxc e k8s que se comunicam via shell
-
Comparação de código entre Ansible e pyinfra
- O exemplo em Ansible usa 16 linhas em
playbook.ymlpara instalarnginx, renderizar template e recarregar o serviço com handler - O exemplo em pyinfra usa 8 linhas em
deploy.pypara escrever o mesmo fluxo em código Python - No exemplo de pyinfra,
systemd.service("nginx", reloaded=True)roda apenas quandocfg.will_changedo resultado defiles.templatefor verdadeiro
from pyinfra.operations import apt, files, systemd apt.packages(["nginx"], update=True) cfg = files.template( src="nginx.conf.j2", dest="/etc/nginx/sites-enabled/api", ) if cfg.will_change: systemd.service("nginx", reloaded=True) - O exemplo em Ansible usa 16 linhas em
-
Declarações
- Code > config: loops continuam sendo loops, sem codificar o fluxo de controle em YAML
- Show, then do: veja primeiro o diff e aplique depois, evitando mudanças inesperadas
- Stay out of the way: executa diretamente via SSH, sem agentes, arquivos de estado ou control plane
- Read like english: as operações são lidas em formato de substantivo e verbo, como
apt.packages,files.template,systemd.service
-
Comando inicial
- O comando de instalação é
$ uv tool install pyinfra - É oferecida a orientação para ler o quickstart de 5 minutos e fazer o deploy do primeiro host
- O comando de instalação é
1 comentários
Opiniões no Lobste.rs
pyinfra parece o que o Ansible deveria ter sido desde o início. Em vez de misturar YAML com templates e adicionar fluxo de controle por cima, dá para escrever a automação diretamente em Python
Foi algo revigorante depois de muito tempo lidando com Ansible, e nem era porque eu detestasse Ansible
Talvez um híbrido que também use Python nos servidores de destino fosse melhor. Assim haveria menos inferno de aspas ao atualizar arquivos, e também daria para evitar coisas como as limitações de regex do
sedGosto do pyinfra e queria que fosse mais amplamente usado
Todas as empresas em que trabalhei até agora usavam Ansible, com ou sem Terraform em paralelo, e nenhuma estava pronta para reescrever toda a automação existente em uma ferramenta sem experiência interna
O pyinfra exige que SysOps saiba Python, e pessoalmente acho que SysOps deveria conhecer ao menos uma linguagem de script. Especialmente porque, no Ansible, escrever módulos em Python também pode reduzir a bagunça de YAML, mas pelo menos na França isso não parece ser uma ideia muito comum
Talvez isso nem seja um tema tão polêmico assim
Eu usava Ansible no meu homelab, mas fui ficando cada vez mais frustrado. Configuração em YAML é horrível, tudo parecia gambiarra, e a velocidade era deprimente. Também não fazia sentido para mim precisar de
python3no servidor só para executar alguns comandos de shellConheci o
pyinfragraças ao Google AI Mode e, no quase um mês em que usei, a experiência foi muito mais leve. As vantagens são que ele é bem mais rápido que Ansible, permite escrever loops e condicionais em Python e, sem roles nem diretórios aninhados, o servidor só precisa ter shell. Ele monta um plano com base no estado atual antes de executar e, se você não passar-y, ainda pede confirmaçãoAs desvantagens são que as tarefas padrão são um subconjunto bem menor que os módulos do Ansible, o código pode virar espaguete rapidamente, e coisas como
if 'web_server' in hosts.groupstambém não parecem muito boas. Talvezoperation(..., filter_group='web_server')seja melhorO pior de tudo é que escrever conectores customizados é sofrido demais. Parece precisar de um
pyproject.tomlcom um entry point específico dopyinfra, e mesmo comuv, desenvolver conectores internos parece um pesadelo. Deveria ser possível fazer isso como um arquivo Python comum dentro do projetoEstou testando o pyinfra por alguns dias como ferramenta de deploy do meu homelab e, comparado ao Ansible, o que mais gostei até agora não foi a sintaxe em Python, mas a velocidade
O Ansible sempre pareceu insuportavelmente lento
Quero substituir o uso de Ansible e Salt na maioria dos lugares
É engraçado como a infraestrutura como código deu a volta completa. Fomos de scripts para YAML e agora voltamos a scripts mais sofisticados
Cada abordagem tem seu ponto ideal, e do ponto de vista de um usuário de Ansible, o pyinfra parece bem interessante
O principal motivo para eu adotar Ansible foi o modo dry-run e visualização de diferenças. Isso me dava confiança de que ele não faria nada inesperado
Mas não parece haver essa opção na CLI do pyinfra. Posso ter deixado passar por não encontrar uma referência com todas as opções listadas em ordem alfabética
—dry, e ela aparece logo na tela inicial do pyinfraPara quem tiver interesse, tenho também um projeto parecido de 14 anos: https://github.com/sebastien/cuisine/tree/main
Ele é sem agente, usa só SSH e oferece uma API em estilo Python sobre funções centrais de gerenciamento, mas não suporta modo dry
Usamos Ansible para provisionar recursos no OpenStack e fazemos o restante com pyinfra, e isso tem funcionado muito bem nos últimos anos
A maior desvantagem é a comunidade pequena, então você acaba escrevendo suas próprias soluções. Por exemplo, armazenamos os segredos compartilhados necessários para deploy em disco com keyring + privy e escrevemos algumas linhas de código para transformar o inventário de computação do OpenStack em dados de hosts