Fabric 是一个用于简化 SSH 远程服务器自动化运维的 Python 库
Fabric 是一个用于简化 SSH 远程服务器自动化运维的 Python 库,特别适合批量部署、配置管理、任务编排等场景。它通过封装 paramiko(SSH 协议实现)提供高层 API,支持以 Python 脚本方式定义任务(tasks),并可跨多台主机并行或串行执行命令、上传/下载文件、管理服务等。
核心特性包括:
- ✅ 基于装饰器
@task定义可调用任务; - ✅ 支持多主机连接(通过
env.hosts或--hosts参数); - ✅ 内置
run()(远程执行)、sudo()(提权执行)、put()(上传)、get()(下载)等操作; - ✅ 支持 Fabric 2.x(推荐)和旧版 Fabric 1.x(已停止维护);Fabric 2.x 使用
fabric包(基于 invoke + paramiko),API 更清晰、模块化更强; - ✅ 可结合 YAML/JSON 配置、环境变量或命令行参数实现灵活的环境管理(如 dev/staging/prod)。
示例(Fabric 2.x):
fromfabricimportConnection,Configfrominvokeimporttask@taskdefdeploy(c,host="web1.example.com"):c=Connection(host,connect_kwargs={"key_filename":"~/.ssh/id_rsa"})c.run("mkdir -p /opt/myapp")c.put("app.tar.gz","/tmp/app.tar.gz")c.sudo("tar -xzf /tmp/app.tar.gz -C /opt/myapp")c.sudo("systemctl restart myapp")运行方式:fab deploy --host web1.example.com
⚠️ 注意:Fabric 2.x 不再内置全局 env 配置,需显式创建 Connection 对象;若需批量主机,可用SerialGroup或ThreadingGroup实现并发执行。
Fabric 2.x 与 Fabric 1.x 是两个不兼容的重大版本,本质属于“重写级”演进(Fabric 2.x 基于 Invoke + Paramiko 重构,而 Fabric 1.x 是单体式设计)。以下是核心区别及迁移要点:
✅主要区别对比:
| 维度 | Fabric 1.x | Fabric 2.x |
|---|---|---|
| 架构 | 单一fabric包,内置任务执行器和 SSH 封装 | 拆分为invoke(本地任务调度) +fabric(远程操作),职责分离 |
| 连接模型 | 全局env.hosts+execute()驱动多主机 | 显式创建Connection对象;批量操作需用Group(如SerialGroup,ThreadingGroup) |
| 任务定义 | @task装饰器 +fab命令行直接调用 | 仍用@task,但必须配合invoke运行(fab实际是 invoke 的 alias);任务函数必须显式接收Context参数(如c) |
| API 风格 | run(),sudo(),put(),get()为全局函数 | 所有操作绑定在Connection实例上:c.run(),c.sudo(),c.put(),c.get() |
| 配置管理 | 依赖env字典(如env.user,env.port) | 使用Config类或~/.fabric.py配置文件,支持层级化、环境感知配置 |
| 并行执行 | execute()+@parallel(有限支持) | 原生支持ThreadingGroup.run(),线程安全且更可控 |
| 维护状态 | 已于 2019 年 EOL(End-of-Life),不再更新 | 当前活跃维护版本(最新稳定版为 2.7+),推荐新项目唯一选择 |
🔧迁移旧脚本的关键步骤:
安装新版依赖
pip uninstall fabric pipinstallfabric invoke# 注意:fabric 2.x 依赖 invoke重写任务函数签名
✅ 旧(1.x):fromfabric.apiimporttask,run@taskdefhello():run("echo 'Hello'")✅ 新(2.x):
fromfabricimporttask@taskdefhello(c):# 必须带 c: Context 参数c.run("echo 'Hello'")替换连接逻辑
- 移除
env.hosts/env.user等全局变量; - 改为显式传参或使用
Connection(host, user=..., connect_kwargs={...}); - 批量主机示例:
fromfabricimportThreadingGroup@taskdefdeploy(c):hosts=["web1","web2"]group=ThreadingGroup(*hosts,connect_kwargs={"key_filename":"~/.ssh/id_rsa"})forresultingroup.run("uptime",hide=True):print(f"{result.connection.host}:{result.stdout.strip()}")
- 移除
配置迁移
创建fabric.py(同目录)或~/.fabric.py:fromfabric.configimportConfig config=Config(overrides={"run":{"echo":True},"connections":{"default":{"connect_kwargs":{"key_filename":"~/.ssh/id_rsa"}}}})命令行变更
fab --list→ 仍可用(底层是 invoke)fab -H host1,host2 taskname→ 不再支持-H;改用fab taskname --hosts host1,host2或在任务中硬编码/参数化
⚠️ 注意事项:
- Fabric 2.x不兼容
fabric.api模块,所有from fabric.api import *必须删除; lcd/cd等上下文管理器变为c.local()和c.cd();- 错误处理更严格:远程命令失败默认抛出
UnexpectedExit,需try/except或设warn=True。