依赖
python2.7
fabric==1.1
2.1 以上的的fabric感觉不是很好用,而且在安装的时候一堆问题,资料也比较少,所以我们在生产环境采用的是 1.1 版本。
安装
$pip install fabric==1.1
一个最简单的例子
直接使用 fab 命令:
当前目录新建 fabfile.py 文件,写入以下内容:
from fabric.api import *
def hello():
print 'hello! %s' % local('echo "$USER"')
保存,在当前目录执行
$fab hello
可以看到如下输出
fabric 做了以下:
- 加载 fabfile.py,并执行 hello() 函数
- 本地执行 ** echo "$USER" **,并返回执行结果
除了 local() 函数以外,fabric 还有以下常用函数:
# Run a shell command on a remote host
# 在服务器上执行命令
run(*args, **kwargs)
# Context manager that keeps directory state when calling remote operations.
# 上下文管理器,用于切换目录
cd(path)
一个略复杂的例子
本例节选自数据组 nginx 自动重启脚本,主要行为:
- 链接服务器
- cd 到指定目录,并从 gitlab 拉取最新 repo
- 将 repo 中的 conf 文件复制到指定目录
- reload nginx
from __future__ import with_statement
from fabric.api import *
import json
env.hosts = ['xx.xx.xx.xx']
env.user = 'test_user'
def copy_config():
source_path = '/home/data/projects/focus-data-nginx-config/%s'
with open('./map.json') as f:
jo = json.load(f)
for j in jo:
target_path = j['target_path']
s_path = source_path % j['source_path']
run('cp %s %s' % (s_path, target_path))
def remote():
project_path = '/home/data'
with cd(project_path):
result = run('ls')
if 'projects' not in result:
run('mkdir projects')
pull_from_git_lab()
run('ls projects/focus-data-nginx-config')
copy_config()
nginx_reload()
def pull_from_git_lab():
with cd('projects'):
if 'focus-data-nginx-config' in run('ls'):
with cd('focus-data-nginx-config'):
run('git pull origin master ')
else:
run('git clone git@xxx.git')
def nginx_reload():
run('sudo nginx -s reload')
启动命令:
$fab remote
特别提醒
利用 fabric 起后台应用时会有问题,比如:
# 不能正常运行,是 fabric 本身的问题
run('nohup java /azkaban-flow-new-0.0.1-SNAPSHOT.jar &')
这时就需要加一个小 trick
# sleep 5 秒就 OK 了
run('nohup java /azkaban-flow-new-0.0.1-SNAPSHOT.jar & sleep 5; exit 0')