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
        '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自动化运维技术与最佳实践》  

http://blog.csdn.net/sijiazhaiyuan/article/details/23884873  运维工具fabric使用总结