背景
最近公司服务器从单机扩展到三机,新环境的搭建和部署也采用了新的自动化方式:Fabric。
什么是Fabric
用Fabric其实就是一套用Python封装了基于SSH的常见操作的库。因此,它的优势显而易见:
- 你可以用Python代理Shell来做运维工作。
- 方便集中式管理多台服务器。
怎样使用Fabric
有Python基础的程序员对Fabric一点都不会陌生,因为它就是Python。
我们先从一个简单的例子开始:
fabfile.py1
2
3
4
| from fabric.api import local
def host_type():
local('uname -s')
|
上面例子的便是实用fabric在local环境下执行命令uname
,就是这么简单。下面在看一个在remote环境下的操作:
fabfile.py1
2
3
4
5
6
7
8
| from fabric.api import run
env.user = 'pat'
env.key_filename = '~/.ssh/id_rsa'
env.password = 'patpassword'
def host_type():
run('uname -s')
|
注意,这次我们用run
代替了local
,它的意思是在remote机器上执行某命令。当然,能够从local连接到remote,并且有执行权限才可以执行,这些都是可以在env
中指定的。env
结论是整个fabric脚本执行中的一个全局变量,env.user
,env.key_filename
和env.password
都是env
的保留关键字,分别指明登陆remote的user,密钥以及密码。密钥和密码可以是二选一。密码在使用sudo
命令的时候是必须的。
如果我们想要管理多台remote服务器的时候该怎么做呢?好,我现在开始介绍。
首先,我需要引入Fabric中的一个概念:role。你可以把role理解成remote的标识,它可以是一个remote,也可以是一组remotes,通常我们在fabfile中是用env.roledefs
来定义的,然后通过指定env.roles
来决定使用那一个/组roles。
fabfile.py1
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
| env.roledefs ={
'local': ['localhost'],
'prd_1': ['192.168.0.100'],
'prd_2': ['192.168.0.101'],
'prd_3': ['192.168.0.102'],
'product': ['192.168.0.100',
'192.168.0.101',
'192.168.0.102',
]
}
def prd_1():
env.user = 'pat'
env.key_filename = 'xxxx'
env.password = 'patpassword'
env.roles = ['prd1']
def prd_2():
env.user = 'pat'
env.key_filename = 'xxxx'
env.password = 'patpassword'
env.roles = ['prd2']
def prd_3():
env.user = 'pat'
env.key_filename = 'xxxxx'
env.password = 'patpassword'
env.roles = ['prd3']
def product():
env.user = 'pat'
env.key_filename = 'xxxx'
env.password = 'patpassword'
env.roles = ['product']
def host_type():
run('uname -s')
|
调用1
2
3
4
5
6
7
8
| # 只在prd_1上执行
fab prd_1 host_type
# 只在prd_2上执行
fab prd_2 host_type
# 同时在三台remote上执行
fab product host_type
|
看到这里,你是否发现其实fab
就是在依次执行后面的方法。嗯,其实道理就是这么简单。
现在,你就可以用Fabric进行自己的集群运维管理了。提示一下,下面两个API不多,先好好了解下Fabric都可以做些什么吧:
- Core API
- Contrib API
- 提供一个完整的Fabfile做参考:fabfile.py