公司有二十多台服务器,每次到了版本发布的时候,非常辛苦,一台台去拷贝可执行程序,然后一台台改配置,之后一台台检测校验程序的正确性,最后一台台启动上线,这是一件非常繁琐和枯燥的事情。对于一两台机器这个工作量倒没什么,但是如果批量到了几十台的基础上,对于部署人员是一个不小的挑战,要保证重复操作20次不错,其实是一件很难的事情。那么批量远端部署成了一件有必要去完成的事情。这就引入了fabric工具。这个工具最大的好处是基于ssh以及python做的开发,对于远端linux机器,不需要装任何客户端可以直接兼容,基本上支持ssh的机器都可以进行远端控制。当然,任何东西不会完美,他也有一些问题,正是因为是基于ssh的处理,所以他的效率并不是很高,并不适合大批量的机器多端部署,体量应该在100台之内没啥问题。
下面简单介绍一下Fabric以及其入门
主机作为Fabric的使用端是基于Python的,官方要求版本2.7以上,我是使用2.7.5,亲自测试过好用,但是在一台2.7.3机器上出现了python的一个库不存在,我并没有去深究,应该是版本的问题。可以通过python -V来查看自己的python版本。如果报错的,那就是python,我们先安装python。如果出现问题的需要安装python,yum install python。
由于fabric源码是在git库上的,我们还需要安装一个git。检测git是否安装成功git –version,这里对git的版本没有要求,只需要可以安全下载代码即可。
两个依赖库安装好之后,就可以下载源码了,源码路径在https://github.com/fabric/fabric
git clone https://github.com/fabric/fabric.git
我们会看到git下载下来的fabric目录,进入这个目录,通过python这个命令执行setup脚本。$python setup.py develop
或者可以yum install fabric也可以用来执行安装(yum安装会默认给你安装好Paramiko)
完成上面几步之后,我们基本上是安装好了。如何是否安装成功,执行这个命令fab -V。如果出现版本就说明安装OK了。否则得退回去一步步查到底哪里出现了问题。
安装OK那么接下来就开始实际操作
什么东西都从hello world开始。我们创建一个python文件。这个文件名有一定的要求,默认必须要fabfile.py。否则会出现找不到fabfile.py的提示。这个文件主要执行在本地完成shell命令,简单代码如下
fromfabric.api import local
defhello():
local('ls-l /home/bjhee/')
如何执行,直接可以
fab hello
这个命令很简单,fab是默认打开fabfile.py文件,执行hello任务。如果想后面带入参数也可以,例如
fromfabric.api import local
defhello(name1, name2):
print"%s and %s say Hello Fabric!" % (name1, name2)
看到现在为止,肯定有人有疑惑,这样的意义是什么,关键是如何在远端执行脚本,因为多机部署的关键还是远端控制
远端并再使用适用刚刚提到的fabric.api的local库,而是使用fabric.api的run这个库,并且在这个文件前,要定义我需要远端的机器名,如果之前配置好代理跳转,并且首次成功跳转的条件下,可以直接ssh过去,而不需要输入用户名密码。否则需要输入用户名密码,整体语法如下(我这里加入了密码身份验证信息,以便密码用户可以直接使用):
fromfabric.api import run, env//使用fabric.api的run库和env库
env.hosts= ['10.10.10.10', '10.10.10.11']//指定服务器的列表,可以是域名,也可以是ip
env.user= 'userecho'//身份验证的用户名
env.password= 'hock'//身份验证的密码
defhello():
run('ls -l /home/userecho/')//run表示在远端执行ls -l 等命令
在我们多台机器条件下,很多使用环境是不一样的,比如要在某一些主机上执行A行文,而在另外一些主机上执行B行为。这样,就需要定义不同的机器,他们的分组。实现如下
fromfabric.api import env, roles, run, execute, cd//需要用到多个fabric.api 的多个库
env.roledefs= {
'staging':['[email protected]','[email protected]'],//定义stageing的分组
'build': ['[email protected]']//定义build的分组
}
env.passwords= {
'staging': '11111',//stageing的分组密码
'build': '123456'//build的分组密码
}
@roles('build')//指定build分组用户的build行为
defbuild():
with cd('/home/build/myapp/'):
run('git pull')
run('python setup.py')
@roles('staging')//定义staging分组用户的deploy的行为
defdeploy():
run('tar xfz /tmp/myapp.tar.gz')
run('cp /tmp/myapp /home/bjhee/www/')
deftask():
execute(build)
execute(deploy)
有了这几个利器基本上可以完成绝大多数需求,我使用的应用场景,就是,先到一台打包机make,生产可执行文件,然后将文件拷贝到各个目的端服务器,进行版本的对应,然后执行程序。