321231255 发表于 2016-11-17 08:57:38

Python Fabric 模块 介绍及简单应用


来源:《Python自动化运维》


1
2
3
4
5
6
7
8
9
10
11
12
Fabric的安装
Fabric支持pip、easy_install或源码安装方式,很方便解决包依赖的问题,具体安装命令如下(
根据用户环境,自行选择pip或easy_install):
pip install fabric
easy_install fabric
Fabric依赖第三方的setuptools、Crypto、paramiko包的支持,源码
安装步骤如下:
# yum -y install python-setuptools
# wget https://pypi.python.org/packages/source/F/Fabric/Fabric-1.8.2.tar.gz --no-check-certificate
# tar -zxvf Fabric-1.8.2.tar.gz
# cd Fabric-1.8.2
# python setup.py install






fab的常用参数fab作为Fabric程序的命令行入口,提供了丰富的参数调用,命令格式如下:fab <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,当命令执行失败,发出告警,而非默认中止任务。·-p,指定目标主机的密码。有时候我们甚至不需要写一行Python代码也可以完成远程操作,直接使用命令行的形式,例如:# fab -p Ksdh3458d(密码) -H 192.168.1.21,192.168.1.22 -- 'uname -s'

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
全局属性设定

evn对象的作用是定义fabfile的全局设定,支持多个属性,
包括目标主机、用户、密码、角色等,各属性说明如下:
·env.host,定义目标主机,可以用IP或主机名表示,
   以Python的列表形式定义,如env.hosts=['192.168.1.21','192.168.1.22']。
·env.exclude_hosts,排除指定主机,如env.exclude_hosts=['192.168.1.22']。
·env.user,定义用户名,如env.user="root"。
·env.port,定义目标主机端口,默认为22,如env.port="22"。
·env.password,定义密码,如env.password='KSJ3548t7d'。
·env.passwords,与password功能一样,区别在于不同主机不同密
码的应用场景,需要注意的是,配置passwords时需配置用户、主机、
端口等信息,如:

env.passwords = {
'root@192.168.1.21:22': 'SJk348ygd',
'root@192.168.1.22:22': 'KSh458j4f',
'root@192.168.1.23:22': 'KSdu43598'
}

·env.gateway,定义网关(中转、堡垒机)IP,如env.gateway='192.168.1.23'。
·env.deploy_release_dir,自定义全局变量,格式:env.+"变量名称",如env.deploy_release_dir、env.age、env.sex等。

·env.roledefs,定义角色分组,比如web组与db组主机区分开来,
定义如下:
env.roledefs = {
    'webservers': ['192.168.1.21', '192.168.1.22', '192.168.1.23','192.168.1.24'],
    'dbservers': ['192.168.1.25', '192.168.1.26']
}






1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
引用时使用Python修饰符的形式进行,角色修饰符下面的任务函数为其作用域,
下面来看一个示例:


env.roledefs = {
    'webservers': ['192.168.1.21', '192.168.1.22', '192.168.1.23','192.168.1.24'],
    'dbservers': ['192.168.1.25', '192.168.1.26']
}
@roles('webservers')
def webtask():
    run('/etc/init.d/nginx start')

@roles('dbservers')
def dbtask():
    run('/etc/init.d/mysql start')

@roles ('webservers', 'dbservers')
def pubclitask():
    run('uptime')


def deploy():
    execute(webtask)
    execute(dbtask)
    execute(pubclitask)

####################################
fab -pxxx@2016-f fa0.py -l
fab -pxxx@2016-f fa0.py webtask
fab -pxxx@2016-f fa0.py 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('/data/user.info','/home/root.info');
·prompt,获得用户输入信息,如:prompt('please input user password:');
·confirm,获得提示信息确认,如:confirm("Tests failed.Continue?");
·reboot,重启远程主机,如:reboot();
·@task,函数修饰符,标识的函数为fab可调用的,非标记对fab不可见,纯业务逻辑;
·@runs_once,函数修饰符,标识的函数只会执行一次,不受多台主机影响。



##文件名是fa.py
#!/usr/bin/env python
from fabric.api import *
env.user='root'
env.hosts=['192.168.23.140','192.168.23.141']
env.password='wdzj@2016'

@runs_once #查看本地系统信息,当有多台主机时只运行一次
def local_task(): #本地任务函数
    local("uname -a")
def remote_task():
    with cd("/tmp"): #"with"的作用是让后面的表达式的语句继承当前状态,实现
      run("ls -l") # "cd /data/logs && ls -l"的效果



##用法,执行下面命令
#fab -pwdzj@2016-f fa.py local_task
#fab -pwdzj@2016-f fa.py remote_task




动态获取远程目录列表
本示例使用“@task”修饰符标志入口函数go()对外部可见,
配合“@runs_once”修饰符接收用户输入,最后调用worktask()任务函数
实现远程命令执行,详细源码如下:
【/home/test/fabric/simple2.py】

#!/usr/bin/env python
from fabric.api import *
env.user='root'
env.hosts=['192.168.23.140','192.168.23.141']
env.password='LKs934jh3'
@runs_once #主机遍历过程中,只有第一台触发此函数
def input_raw():
    return prompt("please input directory name:",default="/home")
def worktask(dirname):
    run("ls -l "+dirname)
@task #限定只有go函数对fab命令可见
def go():
    getdirname = input_raw()
    worktask(getdirname)


# fab -pwdzj@2016 -f fa2.py -l
Available commands:

    go


# fab -pwdzj@2016 -f fa2.py go
。。。
。。。
。。。




网关模式文件上传与执行
本示例通过Fabric的env对象定义网关模式,即俗称的中转、堡垒机环境。
定义格式为“env.gateway='192.168.1.23'”,其中IP“192.168.1.23”为堡垒机IP,
再结合任务函数实现目标主机文件上传与
执行的操作,详细源码如下:

【/home/test/fabric/simple3.py】
from fabric.api import *
from fabric.context_managers import *
from fabric.contrib.console import confirm

env.user = 'root'
env.gateway = '192.168.10.11'# 定义堡垒机IP,作为文件上传、执行的中转设备
env.hosts = ['192.168.23.140', '192.168.23.141']
# 假如所有主机密码都不一样,可以通过env.passwords字典变量一一指定
env.passwords = {
    'root@192.168.1.21:22': 'LKs934jh3',
    'root@192.168.1.22:22': 'LKs934jh3',
    'root@192.168.1.23:22': 'UI7384hg6'# 堡垒机账号信息
}
lpackpath = "/home/install/lnmp0.9.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?"):
      abort("Aborting file put task!")


@task
def run_task():# 执行远程命令,安装lnmp环境
    with cd("/tmp/install"):
      run("tar -zxvf lnmp0.9.tar.gz")
    with cd("lnmp0.9/"):# 使用with继续继承/tmp/install目录位置状态
      run("./centos.sh")

@task
def go():# 上传、安装组合
    put_task()
    run_task()


示例通过简单的配置env.gateway='192.168.1.23'就可以轻松实现堡垒机环境的文件上传及执行,
相比paramiko的实现方法简洁了很多,编写的任务函数完全不用考虑堡垒机环境,
配置env.gateway即可。



页: [1]
查看完整版本: Python Fabric 模块 介绍及简单应用