zoukankan      html  css  js  c++  java
  • 使用Faric+Git进行分布式代码管理

    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)不同的任务如何在不同的服务器上并行执行。

    未解决,待继续研究。




  • 相关阅读:
    程序员应该看的书
    linux下grep命令详解
    apache基本配置
    shell脚本从windows下发送到linux下运行失败的问题
    nginx服务器的安装和配置基础
    linux下ps命令用法
    apache的python部署
    《我刀刻我心——关羽往事》新书发布会在京举行
    C++图书中的王者
    C++应用程序性能优化
  • 原文地址:https://www.cnblogs.com/jchubby/p/5449368.html
Copyright © 2011-2022 走看看