Fabric 是面向运维自动化的 Python 库,核心定位是通过 SSH 在多台远程机器上批量执行命令。
一句话概括: 用 Python 代码代替 SSH + 敲命令,把运维操作编排成脚本,一键执行。
定位对比
- pexpect 管”一个程序”的自动交互
- Fabric 管”多台机器”的批量运维
- Ansible 管”大规模集群”的配置管理
Fabric 处于中间层,比 pexpect 封装度高,比 Ansible 轻量,适合中小型运维场景。
Fabric 能做什么
| 场景 |
说明 |
| 批量执行命令 |
同时在 100 台机器上重启、查日志 |
| 文件上传下载 |
批量部署代码、配置文件 |
| 代码部署 |
打包 → 上传 → 校验 → 解压 → 执行,全流程自动化 |
| Git 同步 |
本地 commit → push,远程 pull,一键部署 |
| 系统管理 |
批量修改配置、安装软件、管理用户 |
Fabric参数接收机制
Fabric 如何接收输入、参数和执行方式,分三个层面:
1. 命令行参数
1 2 3 4 5 6 7 8
| fab -l
fab -H 192.168.17.192,192.168.17.193 deploy
fab -f myfabfile.py go
|
| 参数 |
作用 |
-l |
列出所有 @task 标记的任务 |
-H |
指定目标主机,逗号分隔 |
-f |
指定 fabfile 文件名(默认 fabfile.py) |
-p |
指定并发线程数 |
-w |
任何主机命令失败时立即停止 |
2. 脚本内接收参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| from fabric.api import *
env.hosts = ['192.168.17.192', '192.168.17.193'] env.user = 'itcast' env.password = 'python'
@runs_once def input_raw(): return prompt("please input directory name:", default="/home")
def workask(dirname): run('ls -l ' + dirname)
@task def go(): getdirname = input_raw() workask(getdirname)
|
3. 数据流
命令行参数 (-H, -f)
↓
env 全局配置 (host, user, password)
↓
@task 任务函数被调用
↓
API 函数执行 (run/put/get/local)
↓
SSH 连接 → 远程执行 → 返回结果
核心 API 速查
| API |
作用 |
示例 |
run() |
远程执行命令 |
run('ls -l') |
local() |
本地执行命令 |
local('git status') |
put() |
本地→远程上传 |
put('app.py', '/home/app.py') |
get() |
远程→本地下载 |
get('/var/log/app.log', './app.log') |
sudo() |
远程以 root 执行 |
sudo('apt update') |
cd() |
远程切换目录 |
with cd('/home'): |
lcd() |
本地切换目录 |
with lcd('/src'): |
reboot() |
重启远程主机 |
reboot() |
运行示例
1 2 3 4 5 6 7 8
| fab deploy
fab -H 192.168.17.192 deploy
fab -H 192.168.17.192 --password=python deploy
|