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, in 
    from 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使用总结