首页 > 代码库 > 系统批量运维管理器Fabric详解

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

1、fab常用的参数

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

fab [options] <command>[:arg1,arg2=val2,host=foo,hosts=‘h1;h2‘,...]...

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

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

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

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

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

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

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

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

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

2、全局属性设定

env对象的作用是定义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=‘111111‘

  • env.passwords,与password功能一样,区别在于不同主机不同密码的应用场景,需要注意的是,配置passwords时需要配置用户、主机、端口等信息,如下:

env.passwords={

‘root@192.168.1.21:22‘:‘111111‘

‘root@192.168.1.22:22‘:‘111111‘

‘root@192.168.1.23:22‘:‘111111‘

}

  • 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‘]

    ‘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‘)

    run(‘uptime‘)def deploy():

    execute(webtask)

    execute(dbtask)

    execute(pubclitask)

在命令行执行#fab deploy就可以实现不同角色执行不同的任务函数了。

3、常用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,函数修饰符,标识的函数只会执行一次,不受多台主机影响

4、示例1:查看本地与远程主机信息

#!/usr/bin/env python
#-*- codeing:utf-8 -*-

from fabric.api import *

display local or remote host information
env.user = ‘root‘
env.hosts=[‘192.168.110.129‘]
env.password=‘111111‘
@runs_once
def host_type():
    run(‘uname -s‘)

def remote_task():
    with cd(‘packets‘):
        run(‘ls -l‘)

5、示例2:动态获取远程目录列表

#!/usr/bin/env python
#-*- codeing:utf-8 -*-

#dynamic obtain remote host directory list
env.user = ‘root‘
env.hosts=[‘192.168.110.129‘]
env.password=‘111111‘
@runs_once
def input_raw():
    return prompt(‘please input diectory name:‘,default=‘/root‘)
def worktask(dirname):
    run(‘ls -l ‘ + dirname)
@task
def go():
    getdirname = input_raw()
    worktask(getdirname)

6、示例3:网关模式文件上传与执行

#!/usr/bin/env python
#-*- codeing:utf-8 -*-

#gateway mode put file and execute
from fabric.api import *
from fabric.context_managers import *
from fabric.contrib.console import confirm
env.user=‘root‘
env.gateway=‘192.168.110.129‘
env.hosts=[‘192.168.110.130‘,‘192.168.110.131‘]
env.passwords={
    ‘root@192.168.110.129:22‘:‘111111‘,
    ‘root@192.168.110.130:22‘:‘111111‘,
    ‘root@192.168.110.131:22‘:‘111111‘,
}
lpackpath="/home/install/lnmp0.0.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():
    with cd(‘/tmp/install‘):
        run(‘tar -zxvf lnmp0.9.tar.gz‘)
        with cd(‘lnmp0.9/‘):
            run(‘./centos.sh‘)
@task
def go():
    put_task()
    run_task()

本文出自 “gswcfl” 博客,请务必保留此出处http://guoshiwei.blog.51cto.com/2802413/1925009

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