Fabric简介
fabric是基于python实现的ssh命令行工具,可以实现对服务器的远程shell命令,它是在paramiko库的基础上做了进一步的封装,功能更强大。
fabric官网:
Fabric安装
pip install fabric # pip安装在centos 6.5系统上直接pip安装会有版本的问题:[root@pxe home]# fab -hTraceback (most recent call last): File "/usr/bin/fab", line 5, infrom pkg_resources import load_entry_point File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 2655, in working_set.require(__requires__) File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 648, in require needed = self.resolve(parse_requirements(requirements)) File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 546, in resolve raise DistributionNotFound(req)pkg_resources.DistributionNotFound: paramiko>=1.10解决方法:[root@pxe home]# pip uninstall fabric paramiko[root@pxe home]# pip install paramiko==1.10[root@pxe home]# pip install fabric
[root@pxe home]# fab -help # centos 6.5上的Crypto库版本太低的问题,可以忽略不计/usr/lib64/python2.6/site-packages/Crypto/Util/number.py:57: PowmInsecureWarning: Not using mpz_powm_sec. You should rebuild using libgmp >= 5 to avoid timing attack vulnerability. _warn("Not using mpz_powm_sec. You should rebuild using libgmp >= 5 to avoid timing attack vulnerability.", PowmInsecureWarning)Usage: fab [options][:arg1,arg2=val2,host=foo,hosts='h1;h2',...] ...解决方法:[root@pxe home]# vim /usr/lib64/python2.6/site-packages/Crypto/Util/number.py # 大概56、57行处,注释掉这两行代码 56 if _fastmath is not None and not _fastmath.HAVE_DECL_MPZ_POWM_SEC: 57 _warn("Not using mpz_powm_sec. You should rebuild using libgmp >= 5 to avoid timing attack vulnerability.", Pow mInsecureWarning)[root@pxe home]# fab -help # 现在就不会有warning了Usage: fab [options] [:arg1,arg2=val2,host=foo,hosts='h1;h2',...] ...
注:fabric源码安装依赖第三方的setuptools、Crypto、paramiko包的支持
入门例子
[root@pxe home]# mkdir -p fabric # 创建fabric的开发目录[root@pxe home]# cd fabric/[root@pxe fabric]# pwd/home/fabric[root@pxe fabric]# vim fabfile.py # 编写fabfile文件#!/usr/bin/env pythonfrom fabric.api import run,env,parallelenv.hosts = [ # 定义hosts 'root@172.16.120.12', 'root@172.16.120.13' ]env.password = '99cloud' # root密码@parallel(pool_size=5) # 并发执行def host_type(): run('uname -s') # run方法可以执行shell命令 [root@pxe fabric]# fab host_type # 执行fab命令[root@172.16.120.12] Executing task 'host_type'[root@172.16.120.13] Executing task 'host_type'[root@172.16.120.13] run: uname -s[root@172.16.120.12] run: uname -s[root@172.16.120.13] out: Linux[root@172.16.120.13] out: [root@172.16.120.12] out: Linux[root@172.16.120.12] out: Done.
fab常用参数
-l:显示定义好的任务函数名-f:fab入口文件,默认入口文件名是fabfile.py-g:指定网关(中转)设备,比如堡垒机IP-H:指定目标主机,多台主机用逗号隔开-P:异步并行方式执行多主机任务,默认串行执行-R:指定role,以role区分不同任务执行-t:设置主机连接超时时间(单位:秒)-T:设置远程主机命令执行超时时间(单位:秒)-w:命令执行失败发出告警,而不是默认终止任务
fabfile编写
env对象的可以对fabfile进行全局设定。env.host 定义目标主机,用IP或主机名,如env.hosts = ['172.16.0.1','172.16.0.2']env.exclude_hosts 排除指定主机,如env.exclude_hosts = ['172.16.0.250']env.user 定义用户名,如env.user = 'root'env.password 定义密码,如env.password = 'xxxxxx'env.passwords 与password区别在于不同主机不同密码的应用场景,配置passwords时需要配置用户、主机、端口等信息,如:env.passwords = { 'root@172.16.0.1': 'xxx', 'root@172.16.0.2': 'xxxxx' }env.gateway 定义网关(堡垒机)IP,如env.gateway = '172.16.0.254'env.age 自定义全局变量,格式: env.+ 变量名称,如 env.age = env.roledefs 定义角色分组,如web组与db组主机区分开来,如:env.roledefs = { 'webservers': ['172.16.0.1', '172.16.0.2'], 'dbservers': ['172.16.0.10', '172.16.0.11']}引用的时候,使用python修饰符的形式进行引用,env.roledefs不要和env.hosts共用
Fabric常用API
fabric提供了很强大的fabric.api命令集
1. 直接执行 shell 命令# run(‘cat /var/crawl/client.xml|grep \‘)# run(‘cmd 2′)# run(‘cmd 3′)2. 切换目录并执行# with cd(‘/var/crawl’):# run(‘echo hi >>test.txt’)3. 判断文件或者目录是否存在# ifexists(‘var/crawl/client.xml’):# print ‘Config file exists’# else:# print ‘Config file not exist’4. 从远端服务器下载文件#get(‘/remote/path/to/file’,'/local/path/’)5. 上传文件到远端服务器#put(‘/local/path/to/file’,'/remote/path’)6. 嵌套运行# with prefix(‘cd~/shark-0.9.1/bin/’):# with prefix(‘chmod +x *.sh’):# run(‘shark-shell.sh’)7. sudo# sudo(“mkdir/var/www/new_docroot”, user=”www-data”)8. 获取返回值并执行命令# files = run(‘ls’)# run(‘ls -l’, files)9. lcd 切换本地目录,如 lcd('/home')10. prompt 获得用户输入信息,如prompt('please input user password:')11. confirm 获得提示信息确认,如confirm('Ok[Y/N]?')12. reboot 重启远程主机,如 reboot()13 @task 函数修饰符,标识的函数为fab可调用的14 @runs_once 函数修饰符,标识的函数只会执行一次15 @parallel(pool_size=200) 函数标识符,标识的函数可以并发执行
参考
刘天斯 《python自动化运维技术与最佳实践》
运维工具fabric使用总结