简单的Coder

Code is my life, that's it.

多服务器管理之Fabric

背景

最近公司服务器从单机扩展到三机,新环境的搭建和部署也采用了新的自动化方式:Fabric

什么是Fabric

Fabric其实就是一套用Python封装了基于SSH的常见操作的库。因此,它的优势显而易见:

  1. 你可以用Python代理Shell来做运维工作。
  2. 方便集中式管理多台服务器。

怎样使用Fabric

有Python基础的程序员对Fabric一点都不会陌生,因为它就是Python。
我们先从一个简单的例子开始:

fabfile.py
1
2
3
4
from fabric.api import local

def host_type():
    local('uname -s')
1
fab host_type

上面例子的便是实用fabric在local环境下执行命令uname,就是这么简单。下面在看一个在remote环境下的操作:

fabfile.py
1
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')
1
fab host_type

注意,这次我们用run代替了local,它的意思是在remote机器上执行某命令。当然,能够从local连接到remote,并且有执行权限才可以执行,这些都是可以在env中指定的。env结论是整个fabric脚本执行中的一个全局变量,env.userenv.key_filenameenv.password都是env的保留关键字,分别指明登陆remote的user,密钥以及密码。密钥和密码可以是二选一。密码在使用sudo命令的时候是必须的。
如果我们想要管理多台remote服务器的时候该怎么做呢?好,我现在开始介绍。
首先,我需要引入Fabric中的一个概念:role。你可以把role理解成remote的标识,它可以是一个remote,也可以是一组remotes,通常我们在fabfile中是用env.roledefs来定义的,然后通过指定env.roles来决定使用那一个/组roles。

fabfile.py
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
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都可以做些什么吧:

  1. Core API
  2. Contrib API
  3. 提供一个完整的Fabfile做参考:fabfile.py

Comments