Fabric 是一个高层次的 Python 库,专为通过 SSH 远程执行 shell 命令设计,斩获了 15k+ 的 Star。

Fabric 构建在 Invoke(本地子进程执行和命令行功能)和 Paramiko(SSH 协议实现)之上,将两者的 API 进行整合,提供额外功能。用户可以用它编写 Python 脚本,批量管理远程服务器。很多团队在部署流程、服务器巡检、日志收集等场景中使用 Fabric。它把 SSH 操作变成了 Python 代码,不需要手写一堆 shell 脚本,也不用记复杂的 ssh 命令参数。
Fabric 的核心能力:
远程命令执行:通过 SSH 连接远程主机,执行 shell 命令并获取返回结果。结果以 Python 对象形式返回,包含 stdout、stderr 和 return_code,方便在代码中做后续判断和处理。连接池会自动管理会话,不需要手动处理连接建立和断开。
任务自动化:借助 Invoke 的任务系统,可以将常用操作封装为 task 函数。部署、重启、备份这些重复工作,写一次就可以反复调用。任务之间支持依赖关系,可以定义前置和后置操作。
主机管理和并行执行:支持按角色对主机分组,不同角色执行不同命令。比如 web 服务器跑一套命令,数据库服务器跑另一套,适合复杂的集群场景。同时对多台主机执行命令,配合超时控制和失败处理策略,批量操作效率明显高于串行脚本。

安装使用
Fabric 安装很简单,直接通过 pip 安装:
pip install fabric
Fabric 2.x 支持 Python 3.x 版本,相比 1.x 在设计上有较大改进。Connection 对象是整个 API 的核心,所有操作都围绕它展开。
编写一个简单的 fabfile.py:
python
from fabric import Connection
def disk_free(c):
result = c.run('df -h /', hide=True)
print(result.stdout)
在命令行中运行:
c
fab -H web-1,web-2 disk-free
这段代码会连接 web-1 和 web-2 两台机器,执行磁盘空间检查,输出每台机器的磁盘使用情况。Fabric 会自动处理 SSH 密钥认证、known_hosts 检查等底层细节。
文件传输同样简洁:
python
from fabric import Connection
c = Connection('web-server')
c.put('config.yaml', '/etc/myapp/config.yaml')
c.get('/var/log/app.log', './app.log')
put 方法上传文件,get 方法下载文件。传输过程中自动处理压缩和进度显示,大文件传输也有较好的性能表现。结合临时文件目录和校验机制,文件传输的可靠性有保障。
组合使用效果更好。一个典型的部署任务可以这样写:
python
from fabric import task
@task
def deploy(c):
c.run('git pull origin main')
c.run('pip install -r requirements.txt')
c.run('systemctl restart myapp')
c.run('systemctl status myapp')
在命令行执行 fab deploy,所有步骤自动完成。出错时 Fabric 会抛出异常并给出清晰的错误信息,方便定位问题。
Fabric 在同类工具中定位清晰。Ansible 功能全面但有额外的 YAML 学习成本,Paramiko 偏底层需要自己处理很多细节,Fabric 正好处于中间位置,既保持了 Python 的简洁性,又提供了足够的生产力。对于日常管理几十台服务器的场景,Fabric 是一个轻量且实用的选择。需要批量执行命令、自动化部署或文件分发时,不妨试试这个工具。