使用Faric+Git进行分布式代码管理
来源:互联网 发布:照片美图软件 编辑:程序博客网 时间:2024/06/05 19:07
Fabric是一个Python库,可以通过SSH在多个host上批量执行任务。
可以通过编写任务脚本,然后通过Fabric在本地就可以使用SSH在大量远程服务器上自动运行。
这些功能非常适合应用的自动化部署,或者执行系统管理任务。
Fabric官方文档:
http://www.fabfile.org/
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、测试过程
简单的使用教程请看:
http://www.cnblogs.com/holbrook/archive/2012/03/05/2380398.html
任一机器上项目建立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仓库。
具体流程请参考:
http://www.cnblogs.com/BeginMan/p/3548139.html
注意:
(a)~/.ssh/config中的Host不要相同,并且如果有Host值为*的,将其移动至最后。
(b)要使用ssh-add id_rsa_work将私钥添加入ssh-agent缓存中。
(c)git remote add添加远程库的时候记得使用"git@config中Host的值”。
(2)不同的任务如何在不同的服务器上并行执行。
未解决,待继续研究。
0 0
- 使用Faric+Git进行分布式代码管理
- 用Git 进行分布式代码管理
- 使用Git进行小项目代码管理
- 使用Git进行小项目代码管理
- 使用git进行小项目代码管理
- eclipse使用git进行代码项目管理
- 使用Git进行代码管理操作
- Git进行代码管理
- 分布式代码管理系统GIT
- 使用git进行管理
- ubuntu下使用git进行代码项目管理
- 使用gitosis和git进行代码权限管理
- 使用Git进行产品代码管理的总结
- 使用Git管理代码
- 使用Git管理代码
- 使用Git管理代码
- 使用Git管理代码
- 使用Git管理代码
- 2015年自然语言处理顶级会议EMNLP都讲了些什么?
- undefined reference to cv::imread(cv::String const&, int)
- 信息系统项目管理师-风险管理知识点
- Cluster: ROCK & CLOPE
- java.lang.NoSuchMethodError:android.content.Context.getDrawable
- 使用Faric+Git进行分布式代码管理
- ZigZag Conversion
- 信息系统项目管理师-项目采购管理知识点
- 【引用】四元组与旋转矩阵
- UVALive 3882 And Then There Was One 约瑟夫环问题
- Android中数据的存储方式(一)
- 信息系统项目管理师-项目需求管理知识点
- 面试题——TCP和UDP区别
- 关于Java中用Double型运算时精度丢失的问题,真的很蛋疼!