Fabric自动化部署
Fabric比较轻量级,平时在部署多个服务器时经常用到.
今年作者发布了不向后兼容的Fabric2, 由于原有的脚本改动太多,暂时还没有迁移.
[2018.12更新]
Fabric2现在看来是个错误选择, Fabric v1不支持Python3,而Fabric2仍存在大量bug和未实现功能,从实用的角度看v2基本不可用.
在主流已经使用Python3的情况下,这意味着Fabric毫无迁移必要.
算了不折腾了,直接上Ansible吧.
Fabric2
# 如果要同时安装两个版本,建议使用下面方式安装新版本
pip install fabric2
TODO
Fabric v1
因为默认会安装新版v2,需要指定具体的版本号
pip install Fabric==1.14.1
Q: 如果遇到错误: CTR mode needs counter parameter, not IV
A: 需要升级paramiko库
sudo pip install -U paramiko
fab命令行
- -u User : 以该用户远程登录
- -R ROLES : 以该角色执行任务
- -l : 列出可执行任务
- -P : 切换为并行执行
- -H : 用,分割的远程主机列表
- -f PATH : 加载python模块
# 执行参数化任务
fab mytask:arg1,arg2
fabfile.py的写法
常用接口
from fabric.api import *
run('pwd')
# 忽略错误
with settings(warn_only=True):
sudo('cat /etc/passwd')
文件操作
from fabric.operations import put,get
from fabric.contrib import files
put('/home/xulz/test1.txt', '/home/ubuntu/tmp/')
get('/home/ubuntu/remote.txt','/home/xulz/tmp/')
files.append("/home/xulz/test.txt", "new line")
灵活调用
from fabric.api import execute
from fabric.api import env
env.user = 'xulz'
env.roledefs = {
'db': {
'hosts': ['192.168.1.1']
}
}
@roles('db')
def my_func(arg1,arg2)
pass
def my_task():
execute(my_func,arg1,arg2)
其他
from fabric.colors import red, green