运维治理器Fabric运用要领
Fabric的安装
Fabric支撑pip,easy_install或源码方式安装,很利便解决包依赖题目,(依据会员环境,自行选中pip或ease_install)
pip install fabric
easy_install fabric
源码安装不介绍了。
校验安装效果,要是导入模块没有提醒异样,则注明安装成功:
root@Python_S6:~# python
Python 2.7.5+ (default, Sep 19 2013, 13:48:49)
[GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import fabric
>>>
官网供给了一个简略的入门示例:
root@Python_S6:/home/chart7/test/fabric# cat farbic.py #!/usr/bin/env python # -*- coding: utf-8 -*- from fabric.api import run def host_type(): #定义一个任务函数,通过run要领实现长途施行'uname -s'下令 run('uname -s')
运转效果要是下图所示
下令援用默许文件名为fabfile.py,要是运用非默许文件名称,则需通过'-f'来拟定,如:fab -H 192.168.1.23,192.168.1.24 -f host_type.py host_type,要是治理机与指标主机未配置密钥认证信任,将提醒会输入指标主机对应账户登录密码。
一、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,当下令施行失败,发出告诫,而非默许终止任务
二、fabfile的编写
fab下令是联合我们编写的fabfile.py(其他文件名必须增加-f filename援用)来搭配运用,局部下令行参数可以通过响应的要领来取代,使之更加灵活,列如"-H 192.168.1.23,192.168.1.24",我们可以通过定义env.hosts来实现,如"env.hosts=[192.168.1.23,192.168.1.24]".fabfile的主体由多个自定义的任务函数组成,不一样任务函数实现不一样的操纵逻辑,下面细致介绍
三、全局属性设定
env对象的作用是定义fabfile的全局设定,支撑多个属性,包括指标主机,会员,密码角色,各属性注明如下:
env.host,定义指标主机,可以用IP或主机名表示,以Python的列表情势定义,如env.hosts=['192.168.1.23,192.168.1.24'].
env.exculde_hosts,排除指定主机,如env.exclude_hosts=['192.168.1.23']
env.user,定义会员名,如env.user="root"
env.port,定义指标主机端口,如env.port = '22'
env.password,定义密码,如env.password='123456'
env.passwords,与password功能同样,区别在于不一样主机不一样密码的利用场景,需要注意的是,配置passwords时需要配置会员,主机,端口等信息,如:env.passwords = {'root@192.168.1.21:22':'123456',
'root@192.168.1.23:22':'3234234',
'root@192.168.1.24:23':'09887',
}
env.gateway,定义网关(中转,营垒机)IP,如env.gateway = '192.168.1.1'
env.roledefs,定义角色分组,比方web组与db组主机区分开来,定义如下:
env.roledefs = {
'webservers':['192.168.1.21','192.168.1.22','192.168.1.23'],
'dbservers':['192.168.1.24','192.168.1.25'],
}
援用时运用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 publictask(): run('uptime') def deploy(): execute(webtask) execute(dbtask) execute(publictask)
在下令施行fab 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('/home/user.info','/data/user.info');
prompt,获得会员输入信息,如:prompt('please input user password:');
confirm,获得提醒信息确认,如:confirm('Test failed,Continue[Y/N]');
reboot,重新启动长途主机,如reboot();
@task,函数润饰符,标识符的函数为fab可调用,非标志对fab不可见,纯业务逻辑;
@runs_once,函数润饰符,标识符的函数只会施行一次,不挨多台主机影响;
示例1:查看当地与长途主机信息
本示例调用local()要领施行当地下令,增加"@runs_once"润饰保证该任务函数只施行一次。调用run()要领施行长途下令,
#!/usr/bin/env python # -*- coding: utf-8 -*- from fabric.api import * env.user = 'root' env.hosts = ['192.168.1.43','192.168.1.23','192.168.1.24'] env.port = '22' env.password = '123456' @runs_once #查看当地系统信息,当有多台主机时只运转一次 def local_task(): #当地任务函数 local('uname -a') def remote_task(): with cd('/data'): #with的作用是让背面的表达式语句继承目前状态,实现cd /var && ls -l的结果 run('ls -l')
通过fab下令离别调用local_task任务函数运转结果如下图所示
效果中显示了[192.168.1.23] Executing task 'local_task',但事实上并非在主机192.168.1.23上施行任务,而是返回Fabric主机当地的'uname -a'的施行结果
调用remtoe_task任务函数的施行效果如下图所示
示例2;动态获取长途目录列表
本示例运用"@task"润饰符标记入口函数go()对外部可以,配合"@runs_once"符期待承受会员输入,最后调用worktask()任务函数实现长途下令施行,
#!/usr/bin/env python # -*- coding: utf-8 -*- from fabric.api import * env.user = 'root' env.hosts = ['192.168.1.23','192.168.1.24'] env.password = '123456' @runs_once #在主机遍历历程中,只要一台出发此函数 def input_raw(): return prompt("please input direcotry name:",default="/home") def worktask(dirname): run("ls -l %s" %dirname) @task def go(): getdirname = input_raw() worktask(getdirname)
该示例实现了一个动态输入长途目录名称,在获取目录列表的功能,因为我们只有求输入一次,再显示所有主机上该目录的列表信息,调用了一个子函数input_raw(同时配置)@runs_once润饰符来达到此目的,施行效果如下图
文件上传与施行
#!/usr/bin/env python # -*- coding: utf-8 -*- from fabric.api import * from fabric.context_managers import * from fabric.contrib.console import confirm env.hosts=['192.168.1.23','192.168.1.24'] #假设所有主秘密码都不同,可以通过env.passwords字典变量一一指定 env.passwords = { 'root@192.168.1.23:22': '123456', 'root@192.168.1.24:22': '123456', } lpackpath="/home/a.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 a.tar.gz") @task def go(): put_task() run_task()