pyinfra — agentless infrastructure automation, in plain Python
摘要
pyinfra 是一款 Python 原生的无代理自动化工具,通过 SSH 并发执行命令。它使用纯 Python 编写逻辑,无需 YAML 或 Jinja 模板,具备幂等性且支持 --dry 预览变更。该工具基于 gevent 实现,执行速度优于 Ansible,且无需在目标机器安装 Agent 或维护状态文件,支持从单机到万台服务器的规模化扩展。
荐读理由
用 pyinfra deploy.py 脚本就能在 23 个主机上一次完成部署,8 行代码替代 ansible 16 行;dry run 预览每个操作变更,实现并发 SSH 6 倍加速且零状态文件
原文
┌─ pyinfra v3 ──────────────┐
> automate thousands of servers_
pyinfra is a python-native, agentless automation tool that runs commands over ssh — concurrently, idempotently, and 6× faster than ansible.
$ uv tool install pyinfra
[mit license] · [python 3.10+] · [no agents] · [zero config]
[ read the docs ] [ view on github ]
1
2
3from pyinfra.operations import apt, files, systemd
4
5apt.packages(
6 packages=["nginx", "certbot"],
7 update=True,
8)
9
10files.template(
11 src="templates/nginx.conf.j2",
12 dest="/etc/nginx/sites-enabled/api",
13)
14
15systemd.service("nginx", reloaded=True)
1
2
3web = [
4 ("web-01.prod", {"role": "edge"}),
5 ("web-02.prod", {"role": "edge"}),
6 *[(f"web-{i:02}.prod", {}) for i in range(3, 24)],
7]
8
9db = [
10 ("db-01.prod", {"role": "primary"}),
11 ("db-02.prod", {"role": "replica"}),
12]
13
14
15
$ pyinfra inventory.py deploy.py --limit web
--> Loading inventory…
Hosts: web-01..web-23
--> Gathering facts (concurrent)…
23 hosts · 0.6s
--> Running deploy.py…
✓ web-01.prod 3 ops changed=2 0.42s
✓ web-02.prod 3 ops changed=2 0.39s
⟳ web-03.prod running… apt.packages
--> Summary
successful: 23 changed: 18 failed: 0 total: 2.1s
NORMAL deploy.py python 23 hosts ready · --dry · 17:42
// streaming output
See what changes, before it changes.
Run with --dry for a per-host diff of every operation pyinfra would perform. Run for real and watch results stream back in parallel.
bash · zsh · ~/ops ● live
$ pyinfra inventory.py deploy.py --limit web
--> Loading inventory…
Hosts: web-01..web-24, db-01..db-04
--> Gathering facts (concurrent)…
24 hosts · 0.6s
--> Running deploy.py…
✓ web-01.prod 3 ops changed=2 0.42s
✓ web-02.prod 3 ops changed=2 0.39s
✓ web-03.prod 3 ops changed=0 0.18s
✓ web-04.prod 3 ops changed=2 0.44s
⟳ web-05.prod running… apt.packages
… 19 more
--> Summary
successful: 24 changed: 18 no-change: 6 failed: 0
total: 2.1s
// features
Why pyinfra in six points.
def pure():
Just Python
No yaml. No jinja-in-yaml. Real control flow. Your editor already understands it.
def fast():
Concurrent ssh
6× faster than ansible on identical workloads. Built on gevent + SSH.
def safe():
Diff before apply
Run --dry to preview every change. Operations are idempotent — re-runs are no-ops.
def small():
0 agents
Only requirement on hosts: a shell and ssh. No daemons. No state files. No control plane.
def big():
Scale-ready
Works on 1 host or 10,000. Parallel execution, realtime streaming output.
def open():
Hackable
Custom operation in 10 lines. Connect to anything that speaks a shell — docker, lxc, k8s.
// vs ansible
$ diff ansible/ pyinfra/
--- ansible/playbook.yml 16 lines
- hosts: web
tasks:
- name: install nginx
apt:
name: nginx
update_cache: yes
- name: render config
template:
src: nginx.conf.j2
dest: /etc/nginx/sites-enabled/api
notify: reload nginx
handlers:
- name: reload nginx
service:
name: nginx
state: reloaded
+++ pyinfra/deploy.py 8 lines
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)
// manifesto
#01
Code > config
A loop is just a loop. Stop encoding control flow into yaml.
#02
Show, then do
Diff first. Apply second. Surprise nobody.
#03
Stay out of the way
No agent. No state file. No control plane. SSH and go.
#04
Read like english
Operations are nouns and verbs. apt.packages. files.template. systemd.service.
// 180+ contributors
Thank you to hundreds open source contributors from companies and institutes all over...
01SAP
02EPAM Systems
03Lawrence Livermore
04Utrecht University
05Odoo
06Rochester Inst. of Tech.
07Linköping University
08Paul Scherrer Institute
09Iress
10NPR
11Fox-IT
12Prezi
13Sensorfact
14EDITED
15Cynerio
ready when you are

$ uv tool install pyinfra_
Read the 5-minute quickstart. Deploy your first host today. Replace your ansible repo next quarter.
这条对你有帮助吗?