一个例子

from fabric.api import *
from fabric.contrib.console import confirm
from fabric.utils import abort
env.hosts = [
'root@192.168.43.41:22',
'root@192.168.43.42:22',
'root@192.168.43.40:22'
]
env.passwords = {
'root@192.168.43.41:22':'ze123456',
'root@192.168.43.42:22':'ze123456',
'root@192.168.43.40:22':'ze123456'
}


def hostname():
        run('hostname')
def ls(path='.'):
        run('ls {0}'.format(path))
def tail(path='/etc/passwd', line=10):
        run('tail -n {0} {1}'.format(line, path))

这里使用了三个fabric的封装:

run:用于执行远程命令的封装

sudo:以sudo权限执行远程命令

env:保存用户配置的字典

1、获取任务列表

fab -f fab_example.py --list

-f 用于指定文件名,如果不指定,默认使用fabfile.py文件

2、执行任务(函数)

fab -f fab_example.py hostname(函数名)

一次可以执行多个任务,按照顺序执行

fab -f fab_example.py hostname ls tail

3、fab命令参数

-l:查看task列表
-f:指定fab入口文件
-g:指定网管设备,如在堡垒机环境下,填写堡垒机IP
-H:在命令行指定目标服务器,用逗号分隔多个服务器
-P:以并行方式运行任务,默认为串行
-R:以角色区分不同的服务
-t:链接超时的时间,以秒为单位
-w:命令执行失败时的警告,默认是终止任务

-- Fabric参数,其他包含fabric脚本的中的参数的快捷操作,
如--user,--port,或者直接跟要执行的linux命令

4、env字典

env是一个全局的唯一字典,保存了Fabric所有的配置

常用env配置如下:

env.hosts:定义目标服务器列表
env.exclude_hosts:排除特定的服务器
env.user:SSH到远程服务器的用户名
env.port:远程服务器的端口号
env.key_filename:私钥文件的位置
env.password:SSH到远程服务器的密码

5、fabric提供的常用的指令

run():在远程服务器上执行linux命令,有一个重要的参数pty,如果执行一个需要常驻的服务区进程,需要设置pty=False


sudo():与run类似,使用管理员权限在远程服务器上执行shell指令,同样的有pty参数


loacl():用以执行本地命令,是对python的subprocess模块的封装,可以直接使用此模块,包含capture参数,默认为False表示subprocess输出信息进行显示,不想显示的话指定capture=Ture
def test():
    result = local('make test',capture=True)

    print(result)

    print(result.failed)

    print(result.succeeded)



#返回执行的命令
#如果执行失败那么result.failed为True
#如果执行成功那么result.succeeded为True

get():从远程服务器上获取文件
get(remote_path='/etc/passwd',local_path='/tmp/passwd')


put():将本地的文件上传到远程服务器,可以通过mode参数执行远程文件的权限配置
put(remote_path='/etc/passwd',local_path='/tmp/passwd')


reboot():重启远程服务器,可以通过wait参数设置等待几秒钟重启
    reboot(wait=30)



prompt():用于在fabric执行任务的过程中与管理员进行交互,类似于python的input
key = prompt('please specify process nice level:',key='nice',validate=int)
    confirm():获取提示信息确认

confirm('test failed,continue[Y/N]')

6、fabric的上下文管理器

cd():切换远程目录
    def change(dir='/tmp'):

        with cd(dir):

            run('pwd')

        run('pwd')



lcd():切换本地目录


path():配置远程服务器PATH环境变量,只对当前会话有效,不会影响远程服务器的其他操作,path的修改支持多种模式
    append:默认行为,给指定的路径添加到PATH后面

    prepend:将给定的路径添加到PATH的前面

    replace:替换当前环境的PATH变量

    def addpath():

        with path('/tmp','prepend'):

            run("echo $PATH")

        run("echo $PATH")



prefix():要执行的代码块,都要先执行prefix的命令参数
    def testprefix():

        with cd('/tmp'):

            with prefix("echo 123"):

                run('echo 456')

                run('echo 789')

    等价于linux命令为:

        cd /tmp && echo '123' && echo '456'
                && echo '123' && echo '789'


shell_env():设置shell脚本的环境变量
    def setenv():

        with shell_env(HTTP_PROXY='1.1.1.1'):

            run('echo $HTTP_PROXY')

        run('echo $HTTP_PROXY')
        等价于shell中的export

            export HTTP_PROXY='1.1.1.1'



settings():通用配置,用于临时覆盖env变量
    def who():

        with settings(user='dev'):    #临时修改用户名为dev

            run('who')

        run('who')

remote_tunnel():通过SSH端口转发建立的链接
    with remote_tunnel(3306):

        run('mysql -uroot -p password')



hide()与show()用于隐藏和显示指定类型的输出信息


quiet():隐藏全部输出,仅在执行错误的时候发出告警信息

7、装饰器在任务前加@[装饰器名]

hosts:定制执行task服务器列表
roles:定义执行task的tole列表
parallel:并行执行task
serial:串行执行task
task:定义一个task
runs_once:该task只执行一次


@task装饰器
当使用之歌装饰器时,只有装饰器中包含的函数才会被加载为有效任务
from fabric.api import task
@task
def mytask():
    run('a command')



@hosts装饰器
指定用户名和端口号
@hosts('root@192.168.10.10:22')
@task
def mytask():
    run('a command')

@roles装饰器
用于对不同的服务器分组
env.roledefs={
'web':['root@192.168.10.10:22','root@192.168.10.20:22']    #role名称为web
'db':['root@192.168.10.30:22']    #role名称为db
}
@roles('web')
@task
def mytask():
    run('a command')