Fabric简介
fabric是基于python实现的ssh命令行工具,可以实现对服务器的远程shell命令,它是在paramiko库的基础上做了进一步的封装,功能更强大。
fabric官网:http://www.fabfile.org/
Fabric安装
pip install fabric # pip安装 在centos 6.5系统上直接pip安装会有版本的问题: [root@pxe home]# fab -h Traceback (most recent call last): File "/usr/bin/fab", line 5, in <module> from pkg_resources import load_entry_point File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 2655, in <module> 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] <command>[: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] <command>[: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 python from fabric.api import run,env,parallel env.hosts = [ # 定义hosts '[email protected]', '[email protected]' ] env.password = '99cloud' # root密码 @parallel(pool_size=5) # 并发执行 def host_type(): run('uname -s') # run方法可以执行shell命令 [root@pxe fabric]# fab host_type # 执行fab命令 [[email protected]] Executing task 'host_type' [[email protected]] Executing task 'host_type' [[email protected]] run: uname -s [[email protected]] run: uname -s [[email protected]] out: Linux [[email protected]] out: [[email protected]] out: Linux [[email protected]] 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 = { '[email protected]': 'xxx', '[email protected]': '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自动化运维技术与最佳实践》
http://blog.csdn.net/sijiazhaiyuan/article/details/23884873 运维工具fabric使用总结