Python Fabric 模块 介绍及

发布时间:2019-09-10 09:13:37编辑:auto阅读(1585)



    来源:《Python自动化运维》


    Fabric的安装
    Fabric支持pip、easy_install或源码安装方式,很方便解决包依赖的问题,具体安装命令如下(
    根据用户环境,自行选择pip或easy_install):
    pip install fabric
    easy_install fabric
    Fabric依赖第三方的setuptools、Crypto、paramiko包的支持,源码
    安装步骤如下:
    # yum -y install python-setuptools
    # wget https://pypi.python.org/packages/source/F/Fabric/Fabric-1.8.2.tar.gz --no-check-certificate
    # tar -zxvf Fabric-1.8.2.tar.gz
    # cd Fabric-1.8.2
    # python setup.py install



    fab的常用参数
    fab作为Fabric程序的命令行入口,提供了丰富的参数调用,命令格式如下:
    fab [options] <command>[:arg1,arg2=val2,host=foo,hosts='h1;h2',...]
    ...
    下面列举了常用的几个参数,更多参数可使用fab-help查看。
    ·-l,显示定义好的任务函数名;
    ·-f,指定fab入口文件,默认入口文件名为fabfile.py;
    ·-g,指定网关(中转)设备,比如堡垒机环境,填写堡垒机IP即可;
    ·-H,指定目标主机,多台主机用","号分隔;
    ·-P,以异步并行方式运行多主机任务,默认为串行运行;
    ·-R,指定role(角色),以角色名区分不同业务组设备;
    ·-t,设置设备连接超时时间(秒);
    ·-T,设置远程主机命令执行超时时间(秒);
    ·-w,当命令执行失败,发出告警,而非默认中止任务。
    ·-p,指定目标主机的密码。
    有时候我们甚至不需要写一行Python代码也可以完成远程操作,直接使用命令行的形式,
    例如:
    
    # fab -p Ksdh3458d(密码) -H 192.168.1.21,192.168.1.22 -- 'uname -s'


    全局属性设定
    
    evn对象的作用是定义fabfile的全局设定,支持多个属性,
    包括目标主机、用户、密码、角色等,各属性说明如下:
    ·env.host,定义目标主机,可以用IP或主机名表示,
       以Python的列表形式定义,如env.hosts=['192.168.1.21','192.168.1.22']。
    ·env.exclude_hosts,排除指定主机,如env.exclude_hosts=['192.168.1.22']。
    ·env.user,定义用户名,如env.user="root"。
    ·env.port,定义目标主机端口,默认为22,如env.port="22"。
    ·env.password,定义密码,如env.password='KSJ3548t7d'。
    ·env.passwords,与password功能一样,区别在于不同主机不同密
    码的应用场景,需要注意的是,配置passwords时需配置用户、主机、
    端口等信息,如:
    
    env.passwords = {
    'root@192.168.1.21:22': 'SJk348ygd',
    'root@192.168.1.22:22': 'KSh458j4f',
    'root@192.168.1.23:22': 'KSdu43598'
    }
    
    ·env.gateway,定义网关(中转、堡垒机)IP,如env.gateway='192.168.1.23'。
    ·env.deploy_release_dir,自定义全局变量,格式:env.+"变量名称",如env.deploy_release_dir、env.age、env.sex等。
    
    ·env.roledefs,定义角色分组,比如web组与db组主机区分开来,
    定义如下:
    env.roledefs = {
        'webservers': ['192.168.1.21', '192.168.1.22', '192.168.1.23','192.168.1.24'],
        'dbservers': ['192.168.1.25', '192.168.1.26']
    }


    引用时使用Python修饰符的形式进行,角色修饰符下面的任务函数为其作用域,
    下面来看一个示例:
    
    
    env.roledefs = {
        'webservers': ['192.168.1.21', '192.168.1.22', '192.168.1.23','192.168.1.24'],
        'dbservers': ['192.168.1.25', '192.168.1.26']
    }
    @roles('webservers')
    def webtask():
        run('/etc/init.d/nginx start')
    
    @roles('dbservers')
    def dbtask():
        run('/etc/init.d/mysql start')
    
    @roles ('webservers', 'dbservers')
    def pubclitask():
        run('uptime')
    
    
    def deploy():
        execute(webtask)
        execute(dbtask)
        execute(pubclitask)
        
    ####################################
    fab -p  xxx@2016  -f fa0.py -l
    fab -p  xxx@2016  -f fa0.py webtask
    fab -p  xxx@2016  -f fa0.py deploy
    
    
    
    常用API
    
    Fabric提供了一组简单但功能强大的fabric.api命令集,简单地调用
    这些API就能完成大部分应用场景需求。Fabric支持常用的方法及说明如下:
    ·local,执行本地命令,如:local('uname-s');
    ·lcd,切换本地目录,如:lcd('/home');
    ·cd,切换远程目录,如:cd('/data/logs');
    
    ·run,执行远程命令,如:run('free-m');
    ·sudo,sudo方式执行远程命令,如:sudo('/etc/init.d/httpd start');
    ·put,上传本地文件到远程主机,如:put('/home/user.info','/data/user.info');
    ·get,从远程主机下载文件到本地,如:get('/data/user.info','/home/root.info');
    ·prompt,获得用户输入信息,如:prompt('please input user password:');
    ·confirm,获得提示信息确认,如:confirm("Tests failed.Continue[Y/N]?");
    ·reboot,重启远程主机,如:reboot();
    ·@task,函数修饰符,标识的函数为fab可调用的,非标记对fab不可见,纯业务逻辑;
    ·@runs_once,函数修饰符,标识的函数只会执行一次,不受多台主机影响。
    
    
    
    ##文件名是fa.py
    #!/usr/bin/env python
    from fabric.api import *
    env.user='root'
    env.hosts=['192.168.23.140','192.168.23.141']
    env.password='wdzj@2016'
    
    @runs_once #查看本地系统信息,当有多台主机时只运行一次
    def local_task(): #本地任务函数
        local("uname -a")
    def remote_task():
        with cd("/tmp"): #"with"的作用是让后面的表达式的语句继承当前状态,实现
            run("ls -l") # "cd /data/logs && ls -l"的效果
    
    
    
    ##用法,执行下面命令
    #fab -p  wdzj@2016  -f fa.py local_task
    #fab -p  wdzj@2016  -f fa.py remote_task
    
    
    
    
    动态获取远程目录列表
    本示例使用“@task”修饰符标志入口函数go()对外部可见,
    配合“@runs_once”修饰符接收用户输入,最后调用worktask()任务函数
    实现远程命令执行,详细源码如下:
    【/home/test/fabric/simple2.py】
    
    #!/usr/bin/env python
    from fabric.api import *
    env.user='root'
    env.hosts=['192.168.23.140','192.168.23.141']
    env.password='LKs934jh3'
    @runs_once #主机遍历过程中,只有第一台触发此函数
    def input_raw():
        return prompt("please input directory name:",default="/home")
    def worktask(dirname):
        run("ls -l "+dirname)
    @task #限定只有go函数对fab命令可见
    def go():
        getdirname = input_raw()
        worktask(getdirname)
    
    
    [root@localhost fabric]# fab -p  wdzj@2016 -f fa2.py -l
    Available commands:
    
        go
    
    
    [root@localhost fabric]# fab -p  wdzj@2016 -f fa2.py go
    。。。
    。。。
    。。。
    
    
    
    
    网关模式文件上传与执行
    本示例通过Fabric的env对象定义网关模式,即俗称的中转、堡垒机环境。
    定义格式为“env.gateway='192.168.1.23'”,其中IP“192.168.1.23”为堡垒机IP,
    再结合任务函数实现目标主机文件上传与
    执行的操作,详细源码如下:
    
    【/home/test/fabric/simple3.py】
    from fabric.api import *
    from fabric.context_managers import *
    from fabric.contrib.console import confirm
    
    env.user = 'root'
    env.gateway = '192.168.10.11'  # 定义堡垒机IP,作为文件上传、执行的中转设备
    env.hosts = ['192.168.23.140', '192.168.23.141']
    # 假如所有主机密码都不一样,可以通过env.passwords字典变量一一指定
    env.passwords = {
        'root@192.168.1.21:22': 'LKs934jh3',
        'root@192.168.1.22:22': 'LKs934jh3',
        'root@192.168.1.23:22': 'UI7384hg6'  # 堡垒机账号信息
    }
    lpackpath = "/home/install/lnmp0.9.tar.gz"  # 本地安装包路径
    rpackpath = "/tmp/install"  # 远程安装包路径
    
    
    @task
    def put_task():
        run("mkdir -p /tmp/install")
        with settings(warn_only=True):
            result = put(lpackpath, rpackpath)  # 上传安装包
        if result.failed and not confirm("put file failed,Continue[Y/N]?"):
            abort("Aborting file put task!")
    
    
    @task
    def run_task():  # 执行远程命令,安装lnmp环境
        with cd("/tmp/install"):
            run("tar -zxvf lnmp0.9.tar.gz")
        with cd("lnmp0.9/"):  # 使用with继续继承/tmp/install目录位置状态
            run("./centos.sh")
    
    @task
    def go():  # 上传、安装组合
        put_task()
        run_task()
    
    
    示例通过简单的配置env.gateway='192.168.1.23'就可以轻松实现堡垒机环境的文件上传及执行,
    相比paramiko的实现方法简洁了很多,编写的任务函数完全不用考虑堡垒机环境,
    配置env.gateway即可。

关键字