使用fabric实现简单自动部署

公司测试服务更新比较频繁,为了简化过程,实现以下简单的自动部署
部署流程大概如下图

使用fabric实现简单自动部署_第1张图片

经过多番周折终于在同事的提示下找到了 fabric,但苦于对python不熟,经过一番折腾终于初步实现了以上功能,大概步骤记录如下:
  1. 安装python,我使用ubuntu环境,此步骤省略,如有需要请自行百度。。。(目前fabric貌似仅支持python2.x)
  2. 安装fabric
    官方指导文档安装方式如下
    pip install fabric
    但安装过程中可能会出现编译错误的情况,请根据实际情况自行查找原因
    我在此过程中遇到以下两个问题
    1 python.h缺失,使用 apt-get install python-dev即可解决
    2 忘了。。。也是个.h文件缺失,解决方式如上
  3. 编写代码
# -*- coding: utf-8 -*-
'''
Created on 2017年5月24日

@author: mqy

参数说明:python auto.py 提供5个运行参数 
参数 1 #秘钥位置
参数 2 #服务器地址
参数 3 #tomcat 在服务器的路径
参数 4 #项目名称
参数 5 #打包好的项目位置
'''
import datetime
import time
import os
import sys

from fabric.context_managers import cd
from fabric.operations import local, put, sudo
from fabric.state import env


#tomcat 在服务器的路径
default_tomcat_path = '/usr/local/tomcat'
#服务器地址
default_server_host = '127.0.0.1'
#秘钥位置
default_key_path = '~/key.pem'
#项目名称
default_project_name = 'project'
#打包好的项目位置
default_project_path = '~/project.war'


def copy_to_server():
    local(
        "scp -i {key_path} {product_path} ubuntu@{host}:/tmp/{target_name}".format(
            key_path=default_key_path, product_path=default_project_path, host=default_server_host,target_name=default_project_name+".war"))

def kill_service():
    set_env(default_server_host)
    sudo("kill -9 $(ps -ef|grep -i %s|grep  -v 'grep'|awk '{print $2}')" % default_tomcat_path)

def bak_service():
    set_env(default_server_host)
    with cd("{baseServiceHome}/webapps".format(baseServiceHome=default_tomcat_path)):
        sudo('cp ./{baseService} ../bak/{time}.war.bak'.format(baseService=default_project_name, time=time.mktime(datetime.datetime.now().timetuple())))

def remove_old_service():
    set_env(default_server_host)
    with cd("{baseServiceHome}/webapps".format(baseServiceHome=default_tomcat_path)):
        sudo('rm -rf ./{service_name}'.format(service_name=default_project_name))
        sudo('rm ./{service_name}'.format(service_name=default_project_name+".war"))

def deploy_new_service():
    set_env(default_server_host)
    with cd("{base_service_home}/webapps".format(base_service_home=default_tomcat_path)):
        sudo("mv /tmp/{service_file} ./".format(service_file=default_project_name+".war"))

def start_service():
    set_env(default_server_host)
    with cd("{base_service_home}/bin".format(base_service_home=default_tomcat_path)):
        sudo("set -m;./startup.sh")

def set_env(host):
    env.host_string = host
    env.user = "ubuntu"
    env.key_filename = default_key_path
    env.warn_only = True


def deploy():
    copy_to_server()
    kill_service()
    bak_service()
    remove_old_service()
    deploy_new_service()
    start_service()


if __name__ == '__main__':

    for i in range(len(sys.argv)):
        if i==0:
            pass
        if i==1:
            default_key_path=sys.argv[1]
        if i==2:
            default_server_host=sys.argv[2]
        if i==3:
            default_tomcat_path=sys.argv[3]
        if i==4:
            default_project_name=sys.argv[4]
        if i==5:
            default_project_path=sys.argv[5]
    print default_key_path+"==="+default_server_host+"===="+default_tomcat_path+"====="+default_project_name+"======"+default_project_path
    deploy()

由于本人第一次编写python代码,以上过程还真是有些离奇,但好在功能已经初步实现。也不枉费我折腾一天。

你可能感兴趣的:(Java学习手记)