Fabric是一个Python库,可以通过SSH在多个host上批量执行任务。
可以通过编写任务脚本,然后通过Fabric在本地就可以使用SSH在大量远程服务器上自动运行。
这些功能非常适合应用的自动化部署,或者执行系统管理任务。
Fabric官方文档:
1、安装
(1)easy_install
如果没有easy_install,使用
yum install python-setuptools
进行安装。
若安装失败,其余安装方法:
wget -q http://peak.telecommunity.com/dist/ez_setup.py
python ez_setup.py
(2)安装Fabric
在所有机器上使用
easy_install fabric
进行安装。
若出现错误:缺少Python.h文件等
解决方法:yum install python-devel -y
2、测试过程
简单的使用教程请看:
任一机器上项目建立git仓库,push到远程库。
Fabric执行机制为通过ssh远程操作服务器,使用python编写脚本文件。
使用详情请看代码注释。
新建fabfile.py文件,文件名为固定格式:
from fabric.api import * from fabric.colors import * #服务器主机列表 #env.hosts=['username1@host1:port','username2@host2:port'] #如果多个服务器密码相同直接使用 #env.password='password' #可以使用ssh密钥来代替密码访问远程主机(更安全),前提是需要将公钥保存在远程主机的authorized_keys文件中 #env.key_filename=‘~/.ssh/id_rsa' #若服务器之间密码不同,使用passwords变量存储键值对 #env.passwords = {'username1@host1:port':'password1','username2@host2:port':'password2'} #使用roledefs进行服务器角色分组 #env.roledefs = { # 'role1': ['username1@host1:port'],['username2@host2:port'] # 'role2': ['['username3@host3:port']'] #} #称为任务函数,可在命令行使用fab local_update:msg=msg 直接调用 def local_update(msg): #打印红色字体 print red('local host:ali_ibignose') #打印绿色字体 print green('local git pushing...') #lcd为本地的cd操作 with lcd('/home/omniREST/'): #如果当前没有新的更改直接使用commit会终止任务进行,所以将此中断设置仅为输出警告信息 with settings(warn_only=True): #local为在本地执行命令 local('git add *') local('git commit -m "%s"' % msg) local('git push -u origin master') print green('local git push complete!') #parallel注解的作用是可以使函数并行执行,可用在多个服务器同时进行同一个任务函数 #@parallel def local_docker_restart(): print red('local host:ali_ibignose') print green('local docker restarting...') local('docker restart omniREST ./root/run.sh') print green('local docker restart complete!') #设置角色使用roles注解,那么该任务函数将会在所有角色为role1的机器上执行 #@roles('role1') def remote1_update(): #也可直接在任务函数中指明连接主机的信息 env.user='username' env.host_string='username@host:port' env.password='password' print red('remote host:nc_test') print green('remote git pulling...') #cd为远程cd操作 with cd('/home/omniREST/tomcat/webapps/ROOT'): #run为远程执行命令操作 run('git pull origin master') print green('remote git pull complete!') print '' print green('remote tomcat restarting...') with cd('/home/omniREST/tomcat/bin'): run('./shutdown.sh') run('nohup ./startup.sh') print green('remote tomcat restart complete!') def remote2_update(): print red('remote host:ibignose') print green('remote git pulling...') with cd('/data2/usr/ibignose/tomcat/webapps/ROOT'): run('git pull origin master') print green('remote git pull complete!') print '' print green('remote tomcat restarting...') with cd('/data2/usr/ibignose/tomcat/bin'): run('./shutdown.sh') run('nohup ./startup.sh') print green('remote tomcat restart complete!') #可以在命令行直接使用fab update:msg=msg 来调用所有任务函数 #执行流程为从上到下,一旦遇到终止性的错误将不会继续执行 def update(msg): local_update(msg) print '' local_docker_restart print '' remote1_update() print '' remote2_update()
#遍历字典方式操作多服务器 dict_host={'ibignose':'root@42.62.50.218:22','nc_test':'root@54.223.196.153:22'} dict_user={'ibignose':'root','nc_test':'root'} dict_pwd={'ibignose':'richardg@b83a6fa8','nc_test':'T6yuj&hg'} dict_path={'ibignose':'/data2/usr/ibignose/tomcat','nc_test':'/home/omniREST/tomcat'} def remote_update(): for hostname,host in dict_host.iteritems(): env.user='%s' % dict_user[hostname] env.host_string='%s' % host env.password='%s' % dict_pwd[hostname] print red('remote hostname:%s' % hostname) print green('remote git pulling...') with cd('%s/webapps/ROOT' % dict_path[hostname]): run('git pull origin master') print green('remote git pull complete!') print '' print green('remote tomcat restarting...') with cd('%s/bin' % dict_path[hostname]): run('./shutdown.sh') run('nohup ./startup.sh') print green('remote tomcat restart complete!')
3、遇到的问题
(1)多账号环境下使用远程git仓库。
具体流程请参考:
注意:
(a)~/.ssh/config中的Host不要相同,并且如果有Host值为*的,将其移动至最后。
(b)要使用ssh-add id_rsa_work将私钥添加入ssh-agent缓存中。
(c)git remote add添加远程库的时候记得使用"git@config中Host的值”。
(2)不同的任务如何在不同的服务器上并行执行。
未解决,待继续研究。