Fabric 是一个用于简化 SSH 远程服务器自动化运维的 Python 库

📅 2026/7/17 6:07:45 👁️ 阅读次数 📝 编程学习
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 对象;若需批量主机,可用SerialGroupThreadingGroup实现并发执行。

Fabric 2.x 与 Fabric 1.x 是两个不兼容的重大版本,本质属于“重写级”演进(Fabric 2.x 基于 Invoke + Paramiko 重构,而 Fabric 1.x 是单体式设计)。以下是核心区别及迁移要点:


主要区别对比:

维度Fabric 1.xFabric 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+),推荐新项目唯一选择

🔧迁移旧脚本的关键步骤:

  1. 安装新版依赖

    pip uninstall fabric pipinstallfabric invoke# 注意:fabric 2.x 依赖 invoke
  2. 重写任务函数签名
    ✅ 旧(1.x):

    fromfabric.apiimporttask,run@taskdefhello():run("echo 'Hello'")

    ✅ 新(2.x):

    fromfabricimporttask@taskdefhello(c):# 必须带 c: Context 参数c.run("echo 'Hello'")
  3. 替换连接逻辑

    • 移除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()}")
  4. 配置迁移
    创建fabric.py(同目录)或~/.fabric.py

    fromfabric.configimportConfig config=Config(overrides={"run":{"echo":True},"connections":{"default":{"connect_kwargs":{"key_filename":"~/.ssh/id_rsa"}}}})
  5. 命令行变更

    • 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