您的位置:首页 > 运维架构

系统批量运维管理器Fabric详解

2018-11-14 10:24 120 查看

Fabric是基于Python(2.5及以上版本)实现的SSH命令行工具,简化了SSH的应用程序部署及系统管理任务,它提供了系统基础的操作组件,可以实现本地或远程shell命令,包括命令执行、文件上传、下载及完整执行日志输出等功能。Fab-ric在paramiko的基础上做了更高一层的封装,操作起来会更加简单。Fabric官网地址为:http://www.fabfile.org


一:fab常用参数

    fab作为Fabric程序的命令行入口,提供了丰富的参数调用,命令格式如下:

    fab [options] [:arg1,arg2=val2,host=foo,hosts='h1;h2',...] ...下面列举了常用的几个参数,更多参数可使用fab-help查看。   

        •-l,显示定义好的任务函数名;   

        •-f,指定fab入口文件,默认入口文件名为fabfile.py;   

        •-g,指定网关(中转)设备,比如堡垒机环境,填写堡垒机IP即可;   

        •-H,指定目标主机,多台主机用“,”号分隔;   

        •-P,以异步并行方式运行多主机任务,默认为串行运行;

        •-R,指定role(角色),以角色名区分不同业务组设备;   

        •-t,设置设备连接超时时间(秒);   

        •-T,设置远程主机命令执行超时时间(秒);   

        •-w,当命令执行失败,发出告警,而非默认中止任务。

    有时候我们甚至不需要写一行Python代码也可以完成远程操作,直接使用命令行的形式,例如:

    fab -p "shitouit@2018"  -H 18.16.200.151 -- 'ls '

        命令运行结果如下图

        


二:fabfile的编写

    fab命令是结合我们编写的fabfile.py(其他文件名须添加-f filename引用)来搭配使用的,部分命令行参数可以通过相应的方法来代替,使之更加灵活,例如“-H 192.168.1.21,192.168.1.22”,我们可以通过定义env.hosts来实现,如“env.hosts=['192.168.1.21', '192.168.1.22']”。fab-file的主体由多个自定义的任务函数组成,不同任务函数实现不同的操作逻辑,下面详细介绍。

    1:全局属性设定

        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.pass-word='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.de-ploy_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修饰符的形式进行,角色修饰符下面的任务函数为其作用域,下面来看一个示例:

@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 deploy就可以实现不同角色执行不同的任务函数了。

    2:常用api

        Fabric提供了一组简单但功能强大的fab-ric.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,获得提示信息确认,如:con-firm("Tests failed. Continue[Y/N]?");   

        •reboot,重启远程主机,如:reboot();   

        •@task,函数修饰符,标识的函数为fab可调用的,非标记对fab不可见,纯业务逻辑;   

        •@runs_once,函数修饰符,标识的函数只会执行一次,不受多台主机影响。

    3:示例:查看本地与远程主机信息

        使用local()方法执行本地命令;@runs_once修饰符保证该任务函数只执行一次;run()方法执行远程命令;@task修饰符标致入口函数

#!/usr/bin/env python
from fabric.api import * 

env.usr='root'
env.hosts=['18.16.200.150']
env.password="shitouit@2018"

@runs_once
def local_task():
    local('ifconfig')
@runs_once
def input_raw():
    return prompt('ples input the dir you want to lookup:',default='/root')

def remote_task(dirname):
    with cd(dirname):
      run('ls -l')

@task
def go():
    local_task()
    getdir = input_raw()
    remote_task(getdir)

    执行结果如下图:

    

    

    4:示例:网关模式文件上传与执行

        本示例通过Fabric的evn对象定义网关模式,即俗称的中转、堡垒机环境。定义格式为“env.gateway='18.16.200.150'”,其中IP“18.16.200.150”为堡垒机IP,再结合任务函数实现目标主机文件上传与执行的操作,详细源码如下:

#!/usr/bin/env python
from fabric.api import * 
from fabric.context_managers import *
from fabric.contrib.console import confirm

env.usr='root'
env.gateway='18.16.200.150'
env.hosts=['18.16.200.151','18.16.200.152']
env.passwords={
    "root@18.16.200.151:22": "shitouit@2018",
    "root@18.16.200.152:22": "shitouit@2018",
    "root@18.16.200.150:22": "shitouit@2018",
}

lpackpath = "/root/harbor-offline-installer-v1.4.0.tgz"
rpackpath = "/tmp/install"

@task
def put_task():
    run('mkdir '+ rpackpath)
    with settings(warn_only=True):
        result = put(lpackpath,rpackpath)
    if not result and not confirm("put file faild,Continue[Y/N]?"):
        abort("Aborting file put task!")
@task
def run_task():
    with cd(rpackpath):
        run('tar zvxf harbor-offline-installer-v1.4.0.tgz')

@task
def go():
    put_task()
    run_task()

    执行结果如下图:

    

    

    

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  fabric 运维管理