python fabric 服务器管理实践

依赖

 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

可以看到如下输出


'$fab hello' output

fabric 做了以下:

  1. 加载 fabfile.py,并执行 hello() 函数
  2. 本地执行 ** 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 自动重启脚本,主要行为:

  1. 链接服务器
  2. cd 到指定目录,并从 gitlab 拉取最新 repo
  3. 将 repo 中的 conf 文件复制到指定目录
  4. 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 [email protected]')


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')

你可能感兴趣的:(python fabric 服务器管理实践)