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

Fabric 是一个用于简化 SSH 远程服务器自动化运维的 Python 库 Fabric 是一个用于简化 SSH 远程服务器自动化运维的 Python 库特别适合批量部署、配置管理、任务编排等场景。它通过封装 paramikoSSH 协议实现提供高层 API支持以 Python 脚本方式定义任务tasks并可跨多台主机并行或串行执行命令、上传/下载文件、管理服务等。核心特性包括✅ 基于装饰器task定义可调用任务✅ 支持多主机连接通过env.hosts或--hosts参数✅ 内置run()远程执行、sudo()提权执行、put()上传、get()下载等操作✅ 支持 Fabric 2.x推荐和旧版 Fabric 1.x已停止维护Fabric 2.x 使用fabric包基于 invoke paramikoAPI 更清晰、模块化更强✅ 可结合 YAML/JSON 配置、环境变量或命令行参数实现灵活的环境管理如 dev/staging/prod。示例Fabric 2.xfromfabricimportConnection,Configfrominvokeimporttasktaskdefdeploy(c,hostweb1.example.com):cConnection(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.xFabric 2.x架构单一fabric包内置任务执行器和 SSH 封装拆分为invoke本地任务调度 fabric远程操作职责分离连接模型全局env.hostsexecute()驱动多主机显式创建Connection对象批量操作需用Group如SerialGroup,ThreadingGroup任务定义task装饰器 fab命令行直接调用仍用task但必须配合invoke运行fab实际是 invoke 的 alias任务函数必须显式接收Context参数如cAPI 风格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 年 EOLEnd-of-Life不再更新当前活跃维护版本最新稳定版为 2.7推荐新项目唯一选择迁移旧脚本的关键步骤安装新版依赖pip uninstall fabric pipinstallfabric invoke# 注意fabric 2.x 依赖 invoke重写任务函数签名✅ 旧1.xfromfabric.apiimporttask,runtaskdefhello():run(echo Hello)✅ 新2.xfromfabricimporttasktaskdefhello(c):# 必须带 c: Context 参数c.run(echo Hello)替换连接逻辑移除env.hosts/env.user等全局变量改为显式传参或使用Connection(host, user..., connect_kwargs{...})批量主机示例fromfabricimportThreadingGrouptaskdefdeploy(c):hosts[web1,web2]groupThreadingGroup(*hosts,connect_kwargs{key_filename:~/.ssh/id_rsa})forresultingroup.run(uptime,hideTrue):print(f{result.connection.host}:{result.stdout.strip()})配置迁移创建fabric.py同目录或~/.fabric.pyfromfabric.configimportConfig configConfig(overrides{run:{echo:True},connections:{default:{connect_kwargs:{key_filename:~/.ssh/id_rsa}}}})命令行变更fab --list→ 仍可用底层是 invokefab -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或设warnTrue。