使用Faric+Git进行分布式代码管理

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1010885678/article/details/49129921 Fabric是一个Python库,可以通过SSH在多个host上批量执行任务。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1010885678/article/details/49129921
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)不同的任务如何在不同的服务器上并行执行。

未解决,待继续研究。




相关文章
|
4月前
|
IDE 网络安全 开发工具
【Azure App Service】Local Git App Service的仓库代码遇见卡住不Clone代码的问题
【Azure App Service】Local Git App Service的仓库代码遇见卡住不Clone代码的问题
【Azure App Service】Local Git App Service的仓库代码遇见卡住不Clone代码的问题
|
4月前
|
开发工具 数据安全/隐私保护 git
记录一次使用git工具拉取coding上代码密码账号错误的经历
这篇文章记录了作者在使用Git工具从Coding平台克隆项目时遇到的账号密码错误问题,并分享了通过清除电脑凭证中错误记录的账号密码来解决这个问题的方法。
记录一次使用git工具拉取coding上代码密码账号错误的经历
|
4月前
|
存储 算法 开发工具
|
4月前
|
开发工具 git Python
通过Python脚本git pull 自动重试拉取代码
通过Python脚本git pull 自动重试拉取代码
195 5
|
23天前
|
开发工具 git 开发者
Git 作为最流行的分布式版本控制系统之一,为开发者提供了强大的功能和灵活的操作方式
本文深入介绍了 Git 中的 `git rebase` 操作,涵盖其基本概念、原理、与 `git merge` 的区别、具体操作步骤及应用场景,如保持提交历史整洁、解决合并冲突等,并讨论了其优缺点。强调在公共分支上谨慎使用 rebase,以避免潜在的风险。
34 6
|
22天前
|
存储 算法 开发工具
Git 作为最流行的分布式版本控制系统之一
Git 作为最流行的分布式版本控制系统之一,为开发者提供了强大的功能和灵活的操作方式
34 2
|
1月前
|
Ubuntu 开发工具 git
Git高手必备:掌握这些版本控制最佳实践,让你的代码管理效率翻倍!
【10月更文挑战第25天】使用 Git 进行版本控制是现代软件开发的重要部分。本文详细介绍了 Git 的安装、配置、基本操作、分支管理、冲突解决及常用命令,帮助开发者提高工作效率,确保代码质量和团队协作的顺利进行。通过合理使用 Git,可以有效管理代码变更,支持多人协作,并追踪历史记录。
69 4
|
2月前
|
开发工具 git
git如何修改提交代码时的名字和邮箱?
git如何修改提交代码时的名字和邮箱?
161 4
|
2月前
|
Java Linux 开发工具
IDEA中git提交前如何关闭code analysis以及开启格式化代码
【10月更文挑战第12天】本文介绍了在 IntelliJ IDEA 中关闭代码分析和开启代码格式化的步骤。关闭代码分析可通过取消默认启用检查或针对特定规则进行调整实现,同时可通过设置 VCS 静默模式在提交时跳过检查。开启代码格式化则需在 `Settings` 中配置 `Code Style` 规则,并通过创建 Git 钩子实现提交前自动格式化。
523 3
|
3月前
|
Shell 网络安全 开发工具
git与gitee结合使用,提交代码,文件到远程仓库
本文介绍了如何将Git与Gitee结合使用来提交代码文件到远程仓库。内容涵盖了Git的安装和环境变量配置、SSH公钥的生成和配置、在Gitee上创建仓库、设置Git的全局用户信息、初始化本地仓库、添加远程仓库地址、提交文件和推送到远程仓库的步骤。此外,还提供了如何克隆远程仓库到本地的命令。
git与gitee结合使用,提交代码,文件到远程仓库