Fabric 是什么
Fabric 是对服务器进行系统管理、应用部署的自动化脚本工具,特点是可以便捷的支持多台服务器
在一个脚本文件中就可以对多台服务器执行相同或不同的任务
Fabric基于Python,提供了一套简洁的命令集,可以执行常规任务,例如:在本机或者远程服务器执行shell命令、上传/下载文件、提示用户输入进行交互操作等
还有很多高级功能,例如:对服务器进行分组、并行执行任务、对执行错误进行处理等
应用案例
Instagram 是 Facebook 旗下的一个大型图片社交应用,有上千台服务器
Instagram 的持续部署系统每天需要进行30次以上的代码部署
在使用 Facebook 的分布式部署系统之前,Instagram 就是使用 Fabric 进行超大规模的服务器管理和应用部署
可见 Fabric 功能的强大
使用示例
通过几个简单的示例了解一下Fabric的使用方式
(1) Hello World
新建脚本: fabfile.py
def hello():
print("Hello world!")
命令行执行:
$ fab hello
fabfile.py 是默认执行的文件名,也可以使用其他名字,在执行时需要指定文件
$ mv fabfile.py hello.py
$ fab -f hello.py hello
(2)传入参数
def hello(name, val):
print("%s %s!" % (name, val))
执行
$ fab hello:name=hi,val=world
(3)执行本机命令
from fabric.api import local, lcd
def ls():
with lcd('~'):
local('ls')
lcd - local cd 命令
local - 在本机执行指定命令
(4)混合执行本地和远程服务器命令
from fabric.api import local,cd,run, env
env.hosts=['root@11.28.10.31:28',]
env.password = 'password'
def do_local():
local('echo "in local"')
def do_remote():
print "in remote"
with cd('~'):
run('ls -l')
def opt():
do_local()
do_remote()
执行结果
env.hosts 和 env.password 定义了远程服务器访问信息
然后定义了3个任务,do_local 执行本地任务,do_remote 执行远程任务,opt 调用了前面两个任务
cd、run 都是在远程服务器执行命令,对应的 lcd、local 是在本地执行命令
(5)不同服务器上执行不同的任务
#!/usr/bin/env python
# encoding: utf-8
from fabric.api import *
env.roledefs = {
'testserver': ['root@11.28.10.31:28'],
'realserver': ['root@41.12.56.19:22', ]
}
env.passwords = {
'root@11.28.10.31:28': "password",
'root@41.12.56.19:22': "password",
}
@roles('testserver')
def task1():
run('ls /home')
@roles('realserver')
def task2():
run('ls /home')
def dotask():
execute(task1)
execute(task2)
执行结果
env.roledefs 为服务器组定义了角色
@roles 指定任务在哪个角色的服务器上执行
重要特性:任务的并行执行
并行执行非常强大,尤其在服务器数量非常多时,让服务器间并行执行任务将会节省大量时间
默认情况下,任务都是顺序执行的,例如定义两个任务
from fabric.api import *
def update():
# 任务逻辑
def reload():
# 任务逻辑
在3个服务器中执行这两个任务
$ fab -H web1,web2,web3 update reload
执行结果是这样的:
update on web1
update on web2
update on web3
reload on web1
reload on web2
reload on web3
通过 -P 参数,可以开启并行执行功能
$ fab -H web1,web2,web3 -P update reload
执行结果就会是这样:
update on web1, web2, and web3
reload on web1, web2, and web3
还可以通过任务注解来声明是并行还是顺序执行,例如
from fabric.api import *
@parallel
def runs_in_parallel():
# ...
@serial
def runs_serially():
# ...
执行任务
$ fab -H host1,host2,host3 runs_in_parallel runs_serially
执行结果
runs_in_parallel on host1, host2, and host3
runs_serially on host1
runs_serially on host2
runs_serially on host3
安装
Fabric 是基于 python 的,先装好 python 环境
然后通过系统的包管理器来安装
ubuntu
$ sudo apt-get install fabric
centos
$ yum install fabric
Fabric官网 http://www.fabfile.org