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

资源