使用 fabric

fabric是一个用python实现的远程部署工具,它可以批量操作远程服务器。实际工作中,很多时候需要在多台线上机器上执行同样的操作,这时fabric会很有用。

安装

pip install fabric

使用(fabric.py)

# from fabric.api import cd,run,env,hosts,execute,roles
from fabric.api import *

# 远程机器,多个机器fabric会依次启动
env.hosts = [
    'user@10.16.29.176:22',
    'user@10.16.29.44:22'
]
env.password = '*******'

# 进入/home/user目录,执行命令
def test():
    with cd('/home/user'):
        run('du -sh')

# ----在不同的机器上执行不同的任务
env.roledefs = {
    'server1': [
        'user@10.16.29.176:22',
    ],
    'server2': [
        'user@10.16.29.44:22',
    ]
}
env.password = '*******'

# server1执行task1
@roles('server1')
def task1():
    run('ls /home/ -l | wc -l')

# server2执行task2
@roles('server2')
def task2():
    run('du -sh /home/user')

def test1():
    # 遇到报错警告,而不是退出
    with settings(warn_only=True):
    execute(task1)
    execute(task2)
    exit()

# ----接收参数
def hello(foo):
    print 'Hello, %s'%foo;

执行

fab test

用fabric来部署代码也是一件很爽的事情(upload.py)

# coding=utf-8
from datetime import datetime
from fabric.api import *

env.hosts = ['user@10.16.29.176:22']
env.password = '********'

# 本地打包
def pack():
    tar_files = ['*.py', 'testdir/*']
    local('rm -f deploy.tar.gz')
    local('tar -zcvf deploy.tar.gz --exclude=\'*.tar.gz\' --exclude=\'upload.py\' %s' % ' '.join(tar_files))

# 部署
def deploy():
    tmp_dir = '/tmp/deploy.tar.gz'
    put('deploy.tar.gz', tmp_dir)

    tag = datetime.now().strftime('%y.%m.%d_%H.%M.%S')
    deploy_dir = '/home/user/%s' % tag

    run('mkdir %s' % deploy_dir)
    with cd(deploy_dir):
        run('tar -zxvf %s' % tmp_dir)

    run('rm %s' % tmp_dir)

如果文件名不是fabric.py,需要指定文件名

fab -f upload.py pack
fab -f upload.py deploy

参考

标签: python, fabric

已有 2 条评论

  1. dot

    fabric功能比较弱,自动化运维的话可以用ansible~

    1. 恩,这两个东西感觉就不是一个级别的,不过我现在日常也用ansible,功能更强大

添加新评论