fabric 远程部署工具

python fabric

Posted by LQ on August 18, 2017

项目部署到多台服务器上时,修改了bug,上线了新功能,提交版本库是总是需要执行相同的操作,命令都是一样,时间都浪费在ssh,命令上了,在实习的时候,师父介绍了一个这个工具fabric,可以将自动化部署或者多机操作的命令固化到一个脚本里,这个工具可以一个python脚本将上面的麻烦解决。

安装fabric

!本机和对应服务器都要安装

  • 首先Python的版本必须是2.7以上
$ python -V

$ pip install fabric

//出现,安装成功
Successfully installed bcrypt-3.1.3 fabric-1.13.2 paramiko-2.2.1 pyasn1-0.3.2 pynacl-1.1.2

官方文档

使用fabric

新建一个fabfile.py文件

def hello():
    print "Hello Fabric!"
$ fab hello
Hello Fabric!

文件中每个函数就是一个任务,任务名即函数名 ”fab”命令就是用来执行”fabfile.py”中定义的任务,它必须显式地指定任务名。你可以使用参数”-l”来列出当前”fabfile.py”文件中定义了哪些任务:

	
$ fab -l

任务可以带参数,比如我们将hello函数改为:

def hello(name, value):
    print "Hello Fabric! %s=%s" % (name,value)
$ fab hello:name=qiang,value=luis

Fabric的脚本建议写在”fabfile.py”文件中,文件名不为fabfile.py时需进行指定

$ fab -f script.py hello

本地命令

执行本地操作命令使用local

from fabric.api import local

def test():
    local('cd /home/')
    local('ls -l|wc -l')

“local()”方法有一个”capture”参数用来捕获标准输出,比如:

def hello():
    output = local('echo Hello', capture=True)

远程命令

执行远程操作命令使用run,它通过SSH实现,你需要的是在脚本中配置远程机器地址及登录信息

from fabric.api import run, env
 
env.hosts = ['root@192.168.1.1:22','root@192.168.1.2:22']
env.password = '111111'
 
def hello():
    run('ls -l /home/')

多服务器混合,需要在不同服务器进行不同操作时

from fabric.api import env,roles,run,execute
 
env.roledefs = {
 
    'server1': ['root@192.168.85.99:22',],
     
    'server2': ['root@192.168.85.100:22', ]
 
}
 
env.passwords = {
    'server1': '11111',
    'server2': '123456'
}
 
@roles('server1')
 
def task1():
 
    run('ls /home/ -l | wc -l')
 
@roles('server2')
 
def task2():
 
    run('du -sh /home')
 
def test():
 
    execute(task1)
     
    execute(task2)

SSH

sudo
from fabric.api import env, sudo
 
env.hosts = ['root@192.168.85.99:22', 'root@192.168.85.99:22']
env.password = '111111'
 
def hello():
    sudo('mkdir /var/www/myapp')
get(remote, local): 从远程机器上下载文件到本地
from fabric.api import env, get
 
env.hosts = ['root@192.168.85.99:22',]
env.password = '111111'
 
def hello():
    get('/var/log/1.log', '2.log')
put(local, remote): 从本地上传文件到远程机器上
from fabric.api import env, put
 
env.hosts = ['root@192.168.85.99:22', 'root@192.168.85.99:22']
env.password = '111111'
 
def hello():
    put('/tmp/my11.tar.gz', '/var/www/2.tar.gz')
reboot
from fabric.api import env, reboot
 
env.hosts = ['root@192.168.85.99:22',]
env.password = '111111'
 
def restart():
    reboot(wait=60)

上下文管理器

cd: 设置远程机器的当前工作目录
from fabric.api import env, cd, put
 
env.hosts = ['192.168.1.1', ]
env.password = '111111'
 
def hello():
    with cd('/var/www/'):
        put('/tmp/my201.tar.gz', 'm2p.tar.gz')
lcd: 设置本地工作目录

local cd

path: 添加远程机的PATH路径
settings: 设置Fabric环境变量参数

错误处理

我们希望捕获这个错误而不是退出任务的话,就要开启”warn_only”参数

from fabric.api import env
 
env.warn_only = True

并行执行

  • 在执行”fab”命令时加上”-P”参数
  • 设置”env.parallel”环境参数为True
  • @parallel