首页 > 代码库 > Python自动化打包业务和认证平台

Python自动化打包业务和认证平台

<style type="text/css">/* GitHub stylesheet for MarkdownPad (http://markdownpad.com) */ /* Author: Nicolas Hery - http://nicolashery.com */ /* Version: b13fe65ca28d2e568c6ed5d7f06581183df8f2ff */ /* Source: https://github.com/nicolahery/markdownpad-github */ /* RESET =============================================================================*/ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { margin: 0; padding: 0; border: 0; } /* BODY =============================================================================*/ body { font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; line-height: 1.6; color: #333; background-color: #fff; padding: 20px; max-width: 960px; margin: 0 auto; } body>*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin: 15px 0; } /* HEADERS =============================================================================*/ h1, h2, h3, h4, h5, h6 { margin: 20px 0 10px; padding: 0; font-weight: bold; -webkit-font-smoothing: antialiased; } h1 tt, h1 code, h2 tt, h2 code, h3 tt, h3 code, h4 tt, h4 code, h5 tt, h5 code, h6 tt, h6 code { font-size: inherit; } h1 { font-size: 28px; color: #000; } h2 { font-size: 24px; border-bottom: 1px solid #ccc; color: #000; } h3 { font-size: 18px; } h4 { font-size: 16px; } h5 { font-size: 14px; } h6 { color: #777; font-size: 14px; } body>h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h4:first-child, body>h5:first-child, body>h6:first-child { margin-top: 0; padding-top: 0; } a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 { margin-top: 0; padding-top: 0; } h1+p, h2+p, h3+p, h4+p, h5+p, h6+p { margin-top: 10px; } /* LINKS =============================================================================*/ a { color: #4183C4; text-decoration: none; } a:hover { text-decoration: underline; } /* LISTS =============================================================================*/ ul, ol { padding-left: 30px; } ul li > :first-child, ol li > :first-child, ul li ul:first-of-type, ol li ol:first-of-type, ul li ol:first-of-type, ol li ul:first-of-type { margin-top: 0px; } ul ul, ul ol, ol ol, ol ul { margin-bottom: 0; } dl { padding: 0; } dl dt { font-size: 14px; font-weight: bold; font-style: italic; padding: 0; margin: 15px 0 5px; } dl dt:first-child { padding: 0; } dl dt>:first-child { margin-top: 0px; } dl dt>:last-child { margin-bottom: 0px; } dl dd { margin: 0 0 15px; padding: 0 15px; } dl dd>:first-child { margin-top: 0px; } dl dd>:last-child { margin-bottom: 0px; } /* CODE =============================================================================*/ pre, code, tt { font-size: 12px; font-family: Consolas, "Liberation Mono", Courier, monospace; } code, tt { margin: 0 0px; padding: 0px 0px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-radius: 3px; } pre>code { margin: 0; padding: 0; white-space: pre; border: none; background: transparent; } pre { background-color: #f8f8f8; border: 1px solid #ccc; font-size: 13px; line-height: 19px; overflow: auto; padding: 6px 10px; border-radius: 3px; } pre code, pre tt { background-color: transparent; border: none; } kbd { -moz-border-bottom-colors: none; -moz-border-left-colors: none; -moz-border-right-colors: none; -moz-border-top-colors: none; background-color: #DDDDDD; background-image: linear-gradient(#F1F1F1, #DDDDDD); background-repeat: repeat-x; border-color: #DDDDDD #CCCCCC #CCCCCC #DDDDDD; border-image: none; border-radius: 2px 2px 2px 2px; border-style: solid; border-width: 1px; font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; line-height: 10px; padding: 1px 4px; } /* QUOTES =============================================================================*/ blockquote { border-left: 4px solid #DDD; padding: 0 15px; color: #777; } blockquote>:first-child { margin-top: 0px; } blockquote>:last-child { margin-bottom: 0px; } /* HORIZONTAL RULES =============================================================================*/ hr { clear: both; margin: 15px 0; height: 0px; overflow: hidden; border: none; background: transparent; border-bottom: 4px solid #ddd; padding: 0; } /* TABLES =============================================================================*/ table th { font-weight: bold; } table th, table td { border: 1px solid #ccc; padding: 6px 13px; } table tr { border-top: 1px solid #ccc; background-color: #fff; } table tr:nth-child(2n) { background-color: #f8f8f8; } /* IMAGES =============================================================================*/ img { max-width: 100% }</style><style type="text/css">.highlight { background: #ffffff; } .highlight .c { color: #999988; font-style: italic } /* Comment */ .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ .highlight .k { font-weight: bold } /* Keyword */ .highlight .o { font-weight: bold } /* Operator */ .highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */ .highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */ .highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */ .highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #999999 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #aaaaaa } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { font-weight: bold } /* Keyword.Constant */ .highlight .kd { font-weight: bold } /* Keyword.Declaration */ .highlight .kp { font-weight: bold } /* Keyword.Pseudo */ .highlight .kr { font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #009999 } /* Literal.Number */ .highlight .s { color: #d14 } /* Literal.String */ .highlight .na { color: #008080 } /* Name.Attribute */ .highlight .nb { color: #0086B3 } /* Name.Builtin */ .highlight .nc { color: #445588; font-weight: bold } /* Name.Class */ .highlight .no { color: #008080 } /* Name.Constant */ .highlight .ni { color: #800080 } /* Name.Entity */ .highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #990000; font-weight: bold } /* Name.Function */ .highlight .nn { color: #555555 } /* Name.Namespace */ .highlight .nt { color: #000080 } /* Name.Tag */ .highlight .nv { color: #008080 } /* Name.Variable */ .highlight .ow { font-weight: bold } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mf { color: #009999 } /* Literal.Number.Float */ .highlight .mh { color: #009999 } /* Literal.Number.Hex */ .highlight .mi { color: #009999 } /* Literal.Number.Integer */ .highlight .mo { color: #009999 } /* Literal.Number.Oct */ .highlight .sb { color: #d14 } /* Literal.String.Backtick */ .highlight .sc { color: #d14 } /* Literal.String.Char */ .highlight .sd { color: #d14 } /* Literal.String.Doc */ .highlight .s2 { color: #d14 } /* Literal.String.Double */ .highlight .se { color: #d14 } /* Literal.String.Escape */ .highlight .sh { color: #d14 } /* Literal.String.Heredoc */ .highlight .si { color: #d14 } /* Literal.String.Interpol */ .highlight .sx { color: #d14 } /* Literal.String.Other */ .highlight .sr { color: #009926 } /* Literal.String.Regex */ .highlight .s1 { color: #d14 } /* Literal.String.Single */ .highlight .ss { color: #990073 } /* Literal.String.Symbol */ .highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */ .highlight .vc { color: #008080 } /* Name.Variable.Class */ .highlight .vg { color: #008080 } /* Name.Variable.Global */ .highlight .vi { color: #008080 } /* Name.Variable.Instance */ .highlight .il { color: #009999 } /* Literal.Number.Integer.Long */ .task-list { padding-left:10px; margin-bottom:0; } .task-list li { margin-left: 20px; } .task-list-item { list-style-type:none; padding-left:10px; } .task-list-item label { font-weight:400; } .task-list-item.enabled label { cursor:pointer; } .task-list-item+.task-list-item { margin-top:3px; } .task-list-item-checkbox { display:inline-block; margin-left:-20px; margin-right:3px; vertical-align:1px; }</style>

Python自动化打包业务和认证平台

1.文档摘要

Python 自动化打包业务和认证平台,本机只需执行脚本,远程即可自动部署。

2.更新日志

2014-11-28

文档版本为「1.0」,文档名为「Python自动化打包业务和认证平台 V1.0」,备注为「文档正式版,已测试通过」,By Robin。

3.版本信息

本机 XXX:

系统版本:Mac OS X 10.9.4
主机名:XXX
IP:xxx.xxx.xxx.xxx
Python:2.7.5

远程机 XXX:

系统版本:Debian 7.6
主机名:XXX
IP:xxx.xxx.xxx.xxx
Python:2.7.3
JDK:1.8.25
Maven:3.2.3
SVN:1.6.17

4.先决条件

本机安装软件:

Python 2.7.5
sshpass 1.0.5

安装包如下:

apt-get: python python-pip python-dev subversion subversion-tools
pip: fabric

远程服务器安装软件:

JDK:1.8.25
Maven:3.2.3
SVN:1.6.17

安装包如下:

dos2unix subversion subversion-tools

5.脚本详解

5.1 软件概要

本软件包括两个Python脚本以及一个配置文件。目录结构如下:

tree auto_deploy_app

auto_deploy_app
|-- auto_deploy_app_remote.py
|-- auto_deploy_app_v_final.py
`-- config.conf

0 directories, 3 files

其中,「auto_deploy_app_remote.py」是主执行脚本,用于显示帮助以及调用相应函数。「auto_deploy_app_v_final.py」是核心执行脚本,实现所有的相关功能。「config.conf」是脚本的配置文件。

该脚本实现的功能如下:

  • 打印帮助
  • 部署准备
  • 检出项目
  • 更新项目
  • 部署业务平台
  • 部署认证平台
  • 启动、关闭、重启业务平台
  • 启动、关闭、重启认证平台

5.2 脚本帮助

我们通过如下命令可以获得该脚本的帮助。

./auto_deploy_app_remote.py -h
Auto deploy application to the remote web server. Write in Python.
 Version 1.0. By Robin Wen. Email:dbarobinwen@gmail.com

 Usage auto_deploy_app.py [-hcustrakgdwp]
   [-h | --help] Prints this help and usage message
   [-p | --deploy-prepare] Deploy prepared. Run as root
   [-c | --svn-co] Checkout the newarkstg repo via svn
   [-u | --svn-update] Update the newarkstg repo via svn
   [-s | --shutdown-core] Shutdown the core platform via the stop.sh scripts
   [-t | --startup-core] Startup the core platform via the startup.sh scripts
   [-r | --restart-core] Restart the core platform via the restart.sh scripts
   [-a | --shutdown-auth] Shutdown the auth platform via the stop.sh scripts
   [-k | --startup-auth] Startup the auth platform via the startup.sh scripts
   [-g | --restart-auth] Restart the auth platform via the restart.sh scripts
   [-d | --deploy-core-platform] Deploy core platform via mvn
   [-w | --deploy-auth-platform] Deploy auth platform via mvn

在脚本名后加上「-h 或者 --help」表示打印帮助。
同理,加上「-p | --deploy-prepare」表示部署准备,加上「-c | --svn-co」表示检出项目,加上「-u | --svn-update」表示更新项目,加上「-s | --shutdown-core」表示关闭业务平台,加上「-t | --startup-core」表示启动业务平台,加上「-r | --restart-core」表示重启业务平台,加上「-a | --shutdown-auth」表示关闭认证平台,加上「--startup-auth」表示启动认证平台,加上「-g | --restart-auth」表示重启认证平台,加上「-d | --deploy-core-platform」表示部署业务平台,加上「-w | --deploy-auth-platform」表示部署认证平台。

5.3 脚本概述

如前所述,「auto_deploy_app_remote.py」是主执行脚本,用于显示帮助以及调用相应函数。「auto_deploy_app_v_final.py」是核心执行脚本,实现所有的相关功能。核心执行脚本采用Fabric实现远程执行命令,主执行脚本再通过fab -f 脚本名 任务名调用相应方法。

主执行脚本和核心执行脚本的方法名基本一致,主执行脚本包括如下方法:main(argv)、usage()、svn_co()、svn_update()、shutdown_core()、startup_core()、restart_core()、shutdown_auth()、startup_auth()、restart_auth()、deploy_core_platform()、deploy_auth_platform()和deploy_prepare()。

核心执行脚本包括如下方法:main(argv)、usage()、svn_co()、svn_update()、shutdown_core()、startup_core()、restart_core()、shutdown_auth()、startup_auth()、restart_auth()、deploy_core_platform()、deploy_auth_platform()、deploy_prepare()和getConfig()。

主执行脚本:

  • main(argv) 主函数
  • usage() 使用说明函数
  • svn_co() 检出项目函数
  • svn_update() 更新项目函数
  • shutdown_core() 关闭业务平台方法
  • startup_core() 启动业务平台方法
  • restart_core() 重启业务平台方法
  • shutdown_auth() 关闭认证平台方法
  • startup_auth() 启动认证平台方法
  • restart_auth() 重启认证平台方法
  • deploy_core_platform() 部署业务平台方法
  • deploy_auth_platform() 部署认证平台方法
  • deploy_prepare() 部署准备方法

主执行脚本内容如下:

#!/usr/bin/env python
#encoding:utf-8
# Author: Robin Wen
# Date: 11/25/2014 10:51:54
# Desc: Auto deploy core-platform and auth to remote server. Main scripts.

# Import necessary packages.
import os
import sys, getopt
import socket
import string
import shutil
import getopt
import syslog
import errno
import logging
import tempfile
import datetime
import subprocess
import json
import ConfigParser

from operator import itemgetter
from functools import wraps
from getpass import getpass, getuser
from glob import glob
from contextlib import contextmanager

from fabric.api import env, cd, prefix, sudo, run, hide, local, put
from fabric.contrib.files import exists, upload_template
from fabric.colors import yellow, green, blue, red

try:
    import json
except importError:
    import simplejson as json

script_name=auto_deploy_app_v_final.py
log_path=/var/logs

"""
-----------------------------------------------------------------------------
Auto deploy core-platform and auth to tomcat.

Use the -h or the --help flag to get a listing of options.

Program: Deploy application
Author: Robin Wen
Date: November 25, 2014
Revision: 1.0
"""

# Main function.
def main(argv):
    try:
        # If no arguments print usage
        if len(argv) == 0:
            usage()
            sys.exit()

        # Receive the command line arguments. The execute the corresponding function.
        if sys.argv[1] == "-h" or sys.argv[1] == "--help":
            usage()
            sys.exit()
        elif sys.argv[1] == "-p" or sys.argv[1] == "--deploy-prepare":
            deploy_prepare()
        elif sys.argv[1] == "-c" or sys.argv[1] == "--svn-co":
            svn_co()
        elif sys.argv[1] == "-u" or sys.argv[1] == "--svn-update":
            svn_update()
        elif sys.argv[1] == "-s" or sys.argv[1] == "--shutdown-core":
            shutdown_core()
        elif sys.argv[1] == "-t" or sys.argv[1] == "--startup-core":
            startup_core()
        elif sys.argv[1] == "-r" or sys.argv[1] == "--restart-core":
            restart_core()
        elif sys.argv[1] == "-a" or sys.argv[1] == "--shutdown-auth":
            shutdown_auth()
        elif sys.argv[1] == "-k" or sys.argv[1] == "--startup-auth":
            startup_auth()
        elif sys.argv[1] == "-g" or sys.argv[1] == "--restart-auth":
            restart_auth()
        elif sys.argv[1] == "-d" or sys.argv[1] == "--deploy-core-platform":
            deploy_core_platform()
        elif sys.argv[1] == "-w" or sys.argv[1] == "--deploy-auth-platform":
            deploy_auth_platform() 
    except getopt.GetoptError, msg:
        # If an error happens print the usage and exit with an error       
        usage()
        sys.exit(errno.EIO)

"""
Prints out the usage for the command line.
"""
# Usage funtion.
def usage():
    usage = [" Auto deploy application to the remote web server. Write in Python.\n"]
    usage.append("Version 1.0. By Robin Wen. Email:dbarobinwen@gmail.com\n")
    usage.append("\n")
    usage.append("Usage auto_deploy_app.py [-hcustrakgdwp]\n")
    usage.append("  [-h | --help] Prints this help and usage message\n")
    usage.append("  [-p | --deploy-prepare] Deploy prepared. Run as root\n")
    usage.append("  [-c | --svn-co] Checkout the newarkstg repo via svn\n")
    usage.append("  [-u | --svn-update] Update the newarkstg repo via svn\n")
    usage.append("  [-s | --shutdown-core] Shutdown the core platform via the stop.sh scripts\n")
    usage.append("  [-t | --startup-core] Startup the core platform via the startup.sh scripts\n")
    usage.append("  [-r | --restart-core] Restart the core platform via the restart.sh scripts\n")
    usage.append("  [-a | --shutdown-auth] Shutdown the auth platform via the stop.sh scripts\n")
    usage.append("  [-k | --startup-auth] Startup the auth platform via the startup.sh scripts\n")
    usage.append("  [-g | --restart-auth] Restart the auth platform via the restart.sh scripts\n")
    usage.append("  [-d | --deploy-core-platform] Deploy core platform via mvn\n")
    usage.append("  [-w | --deploy-auth-platform] Deploy auth platform via mvn\n")
    message = string.join(usage)
    print message

# Checkout the newarkstg repo via svn function.
def svn_co():

    print green(Checkout the newarkstg repo via svn.)
    print Logs output to the +log_path+/svn_co.log

    os.system(mkdir -p +log_path+ 2>/dev/null >/dev/null)
    os.system("echo ‘‘ > "+log_path+"/svn_co.log")
    os.system("fab -f "+script_name+" svn_co > "+log_path+"/svn_co.log")

    print green(Checkout finished!)

# Update the newarkstg repo via svn function.
def svn_update():

    print green(Update the newarkstg repo via svn.)
    print Logs output to the +log_path+/svn_update.log

    os.system(mkdir -p +log_path+ 2>/dev/null >/dev/null)
    os.system("echo ‘‘ > "+log_path+"/svn_update.log")
    os.system("fab -f "+script_name+" svn_update > "+log_path+"/svn_update.log")

    print green(Update finished!)

# Shutdown the core platform via the stop.sh scripts function.
def shutdown_core():

    print green(Shutdown the core platform via the stop.sh scripts.)
    print Logs output to the +log_path+/shutdown_core.log

    os.system(mkdir -p +log_path+ 2>/dev/null >/dev/null)
    os.system("echo ‘‘ > "+log_path+"/shutdown_core.log")
    os.system("fab -f "+script_name+" shutdown_core > "+log_path+"/shutdown_core.log")

    print green(Shutdown the core platform finished!)

# Startup the core platform via the startup.sh scripts function.
def startup_core():

    print green(Startup the core platform via the startup.sh scripts.)
    print Logs output to the +log_path+/startup_core.log

    os.system(mkdir -p +log_path+ 2>/dev/null >/dev/null)
    os.system("echo ‘‘ > "+log_path+"/startup_core.log")
    os.system("fab -f "+script_name+" startup_core > "+log_path+"/startup_core.log")

    print green(Startup the core platform finished!)

# Restart the core platform via the restart.sh scripts function.
def restart_core():
    print green(Restart the core platform via the restart.sh scripts.)
    print Logs output to the +log_path+/restart_core.log

    os.system(mkdir -p +log_path+ 2>/dev/null >/dev/null)
    os.system("echo ‘‘ > "+log_path+"/restart_core.log")
    os.system("fab -f "+script_name+" restart_core > "+log_path+"/restart_core.log")

    print green(Restart the core platform finished!)

# Shutdown the auth platform via the stop.sh scripts function.
def shutdown_auth():

    print green(Shutdown the auth platform via the stop.sh scripts.)
    print Logs output to the +log_path+/shutdown_auth.log

    os.system(mkdir -p +log_path+ 2>/dev/null >/dev/null)
    os.system("echo ‘‘ > "+log_path+"/shutdown_auth.log")
    os.system("fab -f "+script_name+" shutdown_auth > "+log_path+"/shutdown_auth.log")

    print green(Shutdown the auth platform finished!)

# Startup the auth platform via the startup.sh scripts function.
def startup_auth():

    print green(Startup the auth platform via the startup.sh scripts.)
    print Logs output to the +log_path+/startup_auth.log

    os.system(mkdir -p +log_path+ 2>/dev/null >/dev/null)
    os.system("echo ‘‘ > "+log_path+"/startup_auth.log")
    os.system("fab -f "+script_name+" startup_auth > "+log_path+"/startup_auth.log")

    print green(Startup the authplatform finished!)

# Restart the auth platform via the restart.sh scripts function.
def restart_auth():
    print green(Restart the core platform via the restart.sh scripts.)
    print Logs output to the +log_path+/restart_auth.log

    os.system(mkdir -p +log_path+ 2>/dev/null >/dev/null)
    os.system("echo ‘‘ > "+log_path+"/restart_auth.log")
    os.system("fab -f "+script_name+" restart_auth> "+log_path+"/restart_auth.log")

    print green(Restart the core platform finished!)

# Deploy core platform via mvn function.
def deploy_core_platform():

    print green(Deploy core platform via mvn.)
    print Logs output to the +log_path+/deploy_core_platform.log

    os.system(mkdir -p +log_path+ 2>/dev/null >/dev/null)
    os.system("echo ‘‘ > "+log_path+"/deploy_core_platform.log")
    os.system("fab -f "+script_name+" deploy_core_platform > "+log_path+"/deploy_core_platform.log")

    print green(Congratulations! Deploy core platform finished!)

# Deploy auth platform via mvn.
def deploy_auth_platform():

    print green(Deploy auth platform via mvn.)
    print Logs output to the +log_path+/deploy_auth_platform.log

    os.system(mkdir -p +log_path+ 2>/dev/null >/dev/null)
    os.system("echo ‘‘ > "+log_path+"/deploy_auth_platform.log")
    os.system("fab -f "+script_name+" deploy_auth_platform > "+log_path+"/deploy_auth_platform.log")

    print green(Congratulations! Deploy auth platform finished!)
    print red(Attention! If you want take a glance of the deploy log, contact the system administrator.)

def deploy_prepare():

    print green(Deploy prepared. Run as root.)
    # Install jdk 1.8.25.
    print red(This program require jdk 1.8.25. Make sure jdk and tomcat work out before all of your operations.)
    #Install Maven
    print green(Install maven.)
    print Logs output to the +log_path+/deploy_prepare.log

    os.system(mkdir -p +log_path+ 2>/dev/null >/dev/null)
    os.system("echo ‘‘ > "+log_path+"/deploy_prepare.log")
    os.system("fab -f "+script_name+" deploy_prepare > "+log_path+"/deploy_prepare.log")

    print green(Deploy prepared finished.)

# The entrance of program.
if __name__==__main__:
    main(sys.argv[1:])

核心执行脚本

方法和主执行脚本基本一致,相同的不赘述。核心执行脚本还提供getConfig()方法,用于读取配置文件。

核心执行脚本内容如下:

#!/usr/bin/env python
#encoding:utf-8
# Author: Robin Wen
# Date: 11/25/2014 10:51:54
# Desc: Auto deploy core-platform and auth to remote server. Core scripts.

# Import necessary packages.
import os
import sys, getopt
import socket
import string
import shutil
import getopt
import syslog
import errno
import logging
import tempfile
import datetime
import subprocess
import json
import ConfigParser

from operator import itemgetter
from functools import wraps
from getpass import getpass, getuser
from glob import glob
from contextlib import contextmanager

from fabric.api import env, cd, prefix, sudo, run, hide, local, put
from fabric.contrib.files import exists, upload_template
from fabric.colors import yellow, green, blue, red

try:
    import json
except importError:
    import simplejson as json

# Configuration file name.
config_file=config.conf

# Get configuration from the Config 
def getConfig(section, key):
    config = ConfigParser.ConfigParser()
    path = os.path.split(os.path.realpath(__file__))[0] + /+config_file
    config.read(path)
    return config.get(section, key)

# Log path
log_path=getConfig("other", "remote_log_path")

# Remote server hosts.
hosts=getConfig("remote", "remote_usr")+"@"+getConfig("remote", "remote_ip")+":"+getConfig("remote", "remote_port")

# Remote server password.
password=getConfig("remote", "remote_pwd")

env.hosts=[hosts,]
env.password = password

# Remote server ip.
remote_ip=getConfig("remote", "remote_ip")

# Remote server username.
remote_usr=getConfig("remote", "remote_usr")

# Remote server password.
remote_pwd=getConfig("remote", "remote_pwd")

# Declare multiple variables.

# Core platform path.
core_platform_path=getConfig("core_path", "core_platform_path")

# Core platform configuration file path.
core_platform_config_path=getConfig("core_path", "core_platform_config_path")

# Auth platform path.
auth_path=getConfig("auth_path", "auth_path")

# Auth platform configuration path.
auth_platform_config_path=getConfig("auth_path", "auth_platform_config_path")

# Core platform config api path
core_platform_config_api_path=getConfig("core_path", "core_platform_config_api_path")

# Core platform config auth path
core_platform_config_auth_path=getConfig("core_path", "core_platform_config_auth_path")

# Auth platform configuration api path.
auth_platform_config_api_path=getConfig("auth_path", "auth_platform_config_api_path")

# Auth platform configuration auth path.
auth_platform_config_auth_path=getConfig("auth_path", "auth_platform_config_auth_path")

# Svn main directory of newarkstg repo.
svn_ns_dir=getConfig("svn_path", "svn_ns_dir")

# Svn core platform path.
svn_core_platform_path=getConfig("svn_path", "svn_core_platform_path")

# Svn core platform target path.
svn_core_platform_target_path=getConfig("svn_path", "svn_core_platform_target_path")

# Database address.
db_addr=getConfig("database", "db_addr")

# Database username.
db_usr=getConfig("database", "db_usr")

# Datbase password.
db_pwd=getConfig("database", "db_pwd")

# SVN username.
svn_username=getConfig("svn", "svn_username")

# SVN password.
svn_password=getConfig("svn", "svn_password")

# SVN url.
svn_url=getConfig("svn", "svn_url")

# Memcached server ip.
memcached_ip=getConfig("memcached", "memcached_ip")

# Memcached server port.
memcached_port=getConfig("memcached", "memcached_port")

# Local ip address. Deploy the application on the localhost by default.
ip_addr=getConfig("remote", "remote_ip")

# Core platform version.
core_version=getConfig("other", "core_version")

# Api port
api_port=getConfig("other", "api_port")

# Core platform bundles path
core_platform_bundles_path=getConfig("core_path", "core_platform_bundles_path")

# Auth platform bundles path
auth_platform_bundles_path=getConfig("auth_path", "auth_platform_bundles_path")

# Core platform jar name
core_platform_jar=getConfig("other", "core_platform_jar")

# Auth platform jar name
auth_platform_jar=getConfig("other", "auth_platform_jar")

# Core jar
core_jar=getConfig("other", "core_jar")

# Auth jar
auth_jar=getConfig("other", "auth_jar")

"""
-----------------------------------------------------------------------------
Auto deploy core-platform and auth to tomcat.

Use the -h or the --help flag to get a listing of options.

Program: Deploy application
Author: Robin Wen
Date: November 25, 2014
Revision: 1.0
"""
# Checkout the newarkstg repo via svn function.
def svn_co():
    print green(Checkout the newarkstg repo via svn.)

    # Create necessary directory
    run(mkdir -p +svn_ns_dir+ 2>/dev/null >/dev/null)

    #run(‘ls -l ‘+path+‘‘)
    with cd(svn_ns_dir):
        run(svn co --username +svn_username+ --password +svn_password+ +svn_url+ +svn_ns_dir+)

    print green(Checkout finished!)

# Update the newarkstg repo via svn function.
def svn_update():
    print green(Update the newarkstg repo via svn.)

    # Create necessary directory
    run(mkdir -p +svn_ns_dir+ 2>/dev/null >/dev/null)

    with cd(svn_ns_dir):
        run(svn update --username +svn_username+ --password +svn_password+ +svn_ns_dir+)

    print green(Update finished!)

# Shutdown the core platform via the stop.sh scripts function.
def shutdown_core():
    print green(Shutdown the core platform via the stop.sh scripts.)

    os.system(sshpass -p +remote_pwd+ ssh -o StrictHostKeyChecking=no +remote_usr+@+remote_ip+ "cd +core_platform_path+; ./stop.sh &" &)

    print green(Shutdown the core platform finished!)

# Startup the core platform via the startup.sh scripts function.
def startup_core():
    print green(Startup the core platform via the startup.sh scripts.)

    os.system(sshpass -p +remote_pwd+ ssh -o StrictHostKeyChecking=no +remote_usr+@+remote_ip+ "cd +core_platform_path+; ./startup.sh &" &)

    print green(Startup the core platform finished!)

# Restart the core platform via the startup.sh scripts function.
def restart_core():
    print green(Restart the core platform via the restart.sh scripts.)

    os.system(sshpass -p +remote_pwd+ ssh -o StrictHostKeyChecking=no +remote_usr+@+remote_ip+ "cd +core_platform_path+; ./restart.sh &" &)

    print green(Restart the core platform finished!)

# Shutdown the auth platform via the stop.sh scripts function.

def shutdown_auth():
    print green(Shutdown the auth platform via the stop.sh scripts.)

    os.system(sshpass -p +remote_pwd+ ssh -o StrictHostKeyChecking=no +remote_usr+@+remote_ip+ "cd +auth_path+; ./stop.sh &" &)

    print green(Shutdown the auth platform finished!)

# Startup the auth platform via the startup.sh scripts function.
def startup_auth():
    print green(Startup the auth platform via the startup.sh scripts.)

    os.system(sshpass -p +remote_pwd+ ssh -o StrictHostKeyChecking=no +remote_usr+@+remote_ip+ "cd +auth_path+; ./startup.sh &" &)

    print green(Startup the authplatform finished!)

# Restart the auth platform via the startup.sh scripts function.
def restart_auth():
    print green(Restart the core platform via the restart.sh scripts.)

    os.system(sshpass -p +remote_pwd+ ssh -o StrictHostKeyChecking=no +remote_usr+@+remote_ip+ "cd +auth_path+; ./restart.sh &" &)

    print green(Restart the core platform finished!)

# Deploy core platform via mvn function.
def deploy_core_platform():
    print green(Deploy core platform via mvn.)

    # Create necessary directory
    run(mkdir -p +log_path+ 2>/dev/null >/dev/null)
    run(mkdir -p +svn_core_platform_path+ 2>/dev/null >/dev/null)
    run(mkdir -p +svn_core_platform_target_path+ 2>/dev/null >/dev/null)
    run(mkdir -p +core_platform_path+ 2>/dev/null >/dev/null)

    with cd(svn_core_platform_path):
        # Print waiting info.
        print 
        print red(Please wait the deploy process until it automatically exit...)

        # Install the necessary jar.

        # Clear the core platform deploy log.
        run(echo "" > +log_path+/core_deploy.log)
        run(mvn install:install-file -Dfile=+svn_core_platform_path+/lib/org.eclipse.osgi_3.10.0.v20140606-1445.jar -DgroupId=org.eclipse.osgi -DartifactId=org.eclipse.osgi -Dversion=3.10.0.v20140606 -Dclassifier=1445 -Dpackaging=jar > +log_path+/core_deploy.log)

        run(mvn install:install-file -Dfile=+svn_core_platform_path+/lib/org.eclipse.osgi.services_3.4.0.v20140312-2051.jar -DgroupId=org.eclipse.osgi -DartifactId=org.eclipse.osgi.services -Dversion=3.4.0.v20140312 -Dclassifier=2051 -Dpackaging=jar >> +log_path+/core_deploy.log)

        # Pack the core platform use mvn command.
        run(mvn clean install >> +log_path+/core_deploy.log)

        # Remove the useless directory.
        run(rm -rf +svn_core_platform_target_path+/+classes)
        run(rm -rf +svn_core_platform_target_path+/+maven-archiver)
        run(rm -rf +svn_core_platform_target_path+/+maven-status)

    # Copy the packed core platform to the deploy directory.
    run(cp -r +svn_core_platform_target_path+/+* +core_platform_path)

    # Remove the newarkstg-osgi-auth_version.jar.
    run(rm -rf +core_platform_path+/bundles/platform/newarkstg-osgi-auth_+core_version+.jar)

    # Change the privileges of scripts. Make it executable.
    run(chmod +x +core_platform_path+/+*.sh)

    # Update the service address. Use the local ip address by default.
    run("sed -i ‘s/^service_addr=.*$/service_addr=http:\/\/"+ip_addr+":8789\/auth\//g‘ "+core_platform_config_auth_path+"/osgi-auth-config.properties")

    # Update the database url.
    run("sed -i ‘s/^url=.*$/url=jdbc:mysql:\/\/"+db_addr+":3306\/cmms_auth\//g‘ "+core_platform_config_auth_path+"/osgi-auth-config.properties")

    # Update the database username.
    run("sed -i ‘s/^username=.*$/username="+db_usr+"/g‘ "+core_platform_config_auth_path+"/osgi-auth-config.properties")
    # Update the database password.
    run("sed -i ‘s/^password=.*$/password="+db_pwd+"/g‘ "+core_platform_config_auth_path+"/osgi-auth-config.properties")

    # Update the authentication server host.
    run("sed -i ‘s/^authentication_server_host_name=.*$/authentication_server_host_name="+ip_addr+"/g‘ "+core_platform_config_api_path+"/osgi-util-config.properties")

    # Update the memcached server ip.
    run("sed -i ‘s/^memcached_server_name=.*$/memcached_server_name="+memcached_ip+"/g‘ "+core_platform_config_api_path+"/osgi-util-config.properties")

    # Update the memcached server port.
    run("sed -i ‘s/^memcached_server_port=.*$/memcached_server_port="+memcached_port+"/g‘ "+core_platform_config_api_path+"/osgi-util-config.properties")

    # Update the memcached server ip.
    run("sed -i ‘s/^memcached_server_name=.*$/memcached_server_name="+memcached_ip+"/g‘ "+core_platform_config_auth_path+"/osgi-auth-config.properties")

    # Update the memcached server port.
    run("sed -i ‘s/^memcached_server_port=.*$/memcached_server_port="+memcached_port+"/g‘ "+core_platform_config_auth_path+"/osgi-auth-config.properties")

    # Update the bundles directory.
    run("sed -i ‘s/^platform\.bundles\.root\.dir=.*$/platform\.bundles\.root\.dir="+core_platform_bundles_path+"/g‘ "+core_platform_config_path+"/osgi-container.properties")

    # Update the api service configuration.
    run("sed -i ‘s/address=.*$/address=\"http:\/\/"+ip_addr+":"+api_port+"\" \>/g‘ "+core_platform_config_api_path+"/api-service.xml")

    # Remove the end of configuration file. ^M mark.
    run("dos2unix "+core_platform_config_auth_path+"/osgi-auth-config.properties")
    run("dos2unix "+core_platform_config_api_path+"/osgi-util-config.properties")
    run("dos2unix "+core_platform_config_path+"/osgi-container.properties")

    # Remove the auth directory.
    run("rm -rf "+core_platform_config_path+"/auth")

    print green(Congratulations! Deploy core platform finished!)

# Deploy auth platform via mvn.
def deploy_auth_platform():
    print green(Deploy auth platform via mvn.)

    # Create necessary directory
    run(mkdir -p +svn_core_platform_target_path+ 2>/dev/null >/dev/null)
    run(mkdir -p +auth_path+ 2>/dev/null >/dev/null)

    # Copy the packed core platform to the deploy directory.
    run("cp -r "+svn_core_platform_target_path+"/"+"* "+auth_path)

    # Change the privileges of scripts. Make it executable.
    run("chmod +x "+auth_path+"/"+"*.sh")

    # Remove the newarkstg-osgi-auth_version.jar.
    run("rm -rf "+auth_path+"/bundles/platform/newarkstg-osgi-auth_"+core_version+".jar")

    # Remove the busi directory.
    run("rm -rf "+auth_path+"/bundles/busi")

    # Update the service address. Use the local ip address by default.
    run("sed -i ‘s/^service_addr=.*$/service_addr=http:\/\/"+ip_addr+":8789\/auth\//g‘ "+auth_platform_config_auth_path+"/osgi-auth-config.properties")

    # Update the database url.
    run("sed -i ‘s/^url=.*$/url=jdbc:mysql:\/\/"+db_addr+":3306\/cmms_auth\//g‘ "+auth_platform_config_auth_path+"/osgi-auth-config.properties")

    # Update the database username.
    run("sed -i ‘s/^username=.*$/username="+db_usr+"/g‘ "+auth_platform_config_auth_path+"/osgi-auth-config.properties")

    # Update the database password.
    run("sed -i ‘s/^password=.*$/password="+db_pwd+"/g‘ "+auth_platform_config_auth_path+"/osgi-auth-config.properties")

    # Update the authentication server host.
    run("sed -i ‘s/^authentication_server_host_name=.*$/authentication_server_host_name="+ip_addr+"/g‘ "+auth_platform_config_api_path+"/osgi-util-config.properties")

    # Update the memcached server ip.
    run("sed -i ‘s/^memcached_server_name=.*$/memcached_server_name="+memcached_ip+"/g‘ "+auth_platform_config_api_path+"/osgi-util-config.properties")

    # Update the memcached server port.
    run("sed -i ‘s/^memcached_server_port=.*$/memcached_server_port="+memcached_port+"/g‘ "+auth_platform_config_api_path+"/osgi-util-config.properties")

    # Update the memcached server ip.
    run("sed -i ‘s/^memcached_server_name=.*$/memcached_server_name="+memcached_ip+"/g‘ "+auth_platform_config_auth_path+"/osgi-auth-config.properties")

    # Update the memcached server port.
    run("sed -i ‘s/^memcached_server_port=.*$/memcached_server_port="+memcached_port+"/g‘ "+auth_platform_config_auth_path+"/osgi-auth-config.properties")

    # Update the bundles directory.
    run("sed -i ‘s/^platform\.bundles\.root\.dir=.*$/platform\.bundles\.root\.dir="+auth_platform_bundles_path+"/g‘ "+auth_platform_config_path+"/osgi-container.properties")

    # Rename the jar.
    with cd(auth_path):
        sudo(./rename.sh +core_platform_jar+ +auth_platform_jar+)

    # Optimize the stop scripts
    run("sed -i ‘s/"+core_jar+"/"+auth_jar+"/g‘ "+auth_path+"/stop.sh")

    # Remove the end of configuration file. ^M mark.
    run("dos2unix "+auth_platform_config_auth_path+"/osgi-auth-config.properties")
    run("dos2unix "+auth_platform_config_api_path+"/osgi-util-config.properties")
    run("dos2unix "+auth_platform_config_path+"/osgi-container.properties")

    # Remove the api directory.
    run("rm -rf "+auth_platform_config_path+"/api")

    print green(Congratulations! Deploy auth platform finished!)

def deploy_prepare():
    print green(Deploy prepared. Run as root.)

    # Install jdk 1.8.25.
    print red(This program require jdk 1.8.25. Make sure jdk and tomcat work out before all of your operations.)

    # Install maven.
    print green(Insall maven.)
    run("wget http://apache.fayea.com/apache-mirror/maven/maven-3/3.2.3/binaries/apache-maven-3.2.3-bin.zip")
    run("unzip -q apache-maven-3.2.3-bin.zip")
    run("mv apache-maven-3.2.3 /usr/local/maven")
    run("echo ‘export M2_HOME=/usr/local/maven‘ >> /etc/profile")
    run("echo ‘export PATH=$PATH:$M2_HOME/bin‘ >> /etc/profile")
    run("source /etc/profile")
    run("rm -rf apache-maven-3.2.3-bin.zip apache-maven-3.2.3")
    run("mvn -version")

    log_path=/root/logs

    run(mkdir -p +log_path+ 2>/dev/null >/dev/null)

    # Clear the install_requirement.log
    run(echo "" > +log_path+/install_requirement.log)

    # Install Python and fabric on the remote server.
    run("apt-get install dos2unix python python-pip python-dev subversion subversion-tools -y > "+log_path+"/install_requirement.log")
    run("pip install fabric >> "+log_path+"/install_requirement.log")

    # Install Python and fabric on the local server.
    os.system("apt-get install dos2unix python python-pip python-dev subversion subversion-tools -y > "+log_path+"/install_requirement.log")
    os.system("pip install fabric >> "+log_path+"/install_requirement.log")

    # Install sshpass.
    print green(Install sshpass.)
    os.system("wget http://jaist.dl.sourceforge.net/project/sshpass/sshpass/1.05/sshpass-1.05.tar.gz")
    os.system("tar -zxf sshpass-1.05.tar.gz")
    os.system("cd sshpass-1.05 && ./configure && make && make install")

    print green(Deploy prepared finished.)

5.4 配置文件概述

完整配置文件内容如下(因涉及利益问题,所有的配置已去除,读者可以根据需要配置):

# Database config section.
[database]
# Database address.
db_addr=
# Database username.
db_usr=
# Datbase password.
db_pwd=

# Remote server section.
[remote]
# Remote server ip.
remote_ip=
# Remote server port.
remote_port=
# Remote server username.
remote_usr=
# Remote server password.
remote_pwd=

# SVN path section.
[svn_path]
# Svn main directory of newarkstg repo.
svn_ns_dir=
# Svn core platform path.
svn_core_platform_path=
# Svn core platform target path.
svn_core_platform_target_path=

# SVN configuration section. 
[svn]
svn_username=
svn_password=
svn_url=

# Core platform path config section.
[core_path]
# Core platform path.
core_platform_path=
# Core platform config path.
core_platform_config_path=
# Core platform config api path
core_platform_config_api_path=
# Core platform config auth path
core_platform_config_auth_path=
# Core platform bundles path
core_platform_bundles_path=

# Auth platform path config section.
[auth_path]
# Auth platform path.
auth_path=
# Auth platform configuration path.
auth_platform_config_path=
# Auth platform configuration api path.
auth_platform_config_api_path=
# Auth platform configuration auth path.
auth_platform_config_auth_path=
# Authplatform bundles path
auth_platform_bundles_path=

# Memcached configuration section.
[memcached]
# Memcached server ip.
memcached_ip=
# Memcached server port.
memcached_port=

# Other configuration section
[other]
# Core platform version.
core_version=
# Remote log path
remote_log_path=
# Api port
api_port=
# Core platform jar name
core_platform_jar=
# Auth platform jar name
auth_platform_jar=
# Core jar
core_jar=
# Auth jar
auth_jar=

接下来,我逐一进行讲解。

配置文件包括以下段:database、remote、svn_path、svn、core_path、auth_path、memcached和other。

每个段的说明如下:

  • database 该段定义数据库配置。
    • db_addr MySQL数据库地址。
    • db_usr MySQL数据库用户名。
    • db_pwd MySQL数据库密码。
  • remote 该段定义远程服务器登录信息。
    • remote_ip 部署远程服务器IP。
    • remote_port 部署远程服务器端口。
    • remote_usr 部署远程服务器用户名。
    • remote_pwd 部署远程服务器密码。
  • svn_path 该段定义远程服务器SVN目录。
    • svn_ns_dir 项目主SVN目录。
    • svn_core_platform_path 业务平台SVN目录。
    • svn_core_platform_target_path 业务平台Target目录,用于存放打包后的文件。
  • svn 该段定义SVN的账户信息。
    • svn_username SVN用户名。
    • svn_password SVN密码。
    • svn_url SVN地址。
  • core_path 该段定义部署后的业务平台目录。
    • core_platform_path 业务平台主目录。
    • core_platform_config_path 业务平台配置文件目录。
    • core_platform_config_api_path 业务平台API配置文件目录。
    • core_platform_config_auth_path 业务平台AUTH配置文件目录。
    • core_platform_bundles_path 业务平台Bundles目录。
  • auth_path 该段定义部署后的认证平台目录。
    • auth_path 认证平台主目录。
    • auth_platform_config_path 认证平台配置文件目录。
    • auth_platform_config_api_path 认证平台API配置文件目录。
    • auth_platform_config_auth_path 认证平台AUTH配置文件目录。
    • auth_platform_bundles_path 认证平台Bundles目录。
  • memcached 该段定义Memcached相关信息。
    • memcached_ip Memcached服务器IP。
    • memcached_port Memcached服务器端口。
  • other 该段定义其他配置信息。
    • core_version 业务平台版本号。
    • remote_log_path 远程服务器日志文件目录,用于存放部署业务平台产生的日志。
    • api_port 业务平台的API端口。
    • core_platform_jar 打包生成的业务平台jar包。
    • auth_jar 认证平台jar包。

以上是所有的配置项,请酌情修改。

6.脚本使用

如果您是第一次使用该脚本打包,请依次执行如下命令:

# 第一步,编辑配置文件;
vim config.conf

# 第二步,显示帮助;
./auto_deploy_app_remote.py -h

# 第三步,准备部署;
./auto_deploy_app_remote.py -p

# 第四步,检出项目;
./auto_deploy_app_remote.py -c

# 第五步,部署业务平台;
./auto_deploy_app_remote.py -d

# 第六步,部署认证平台;
./auto_deploy_app_remote.py -w

# 第七步,启动认证平台
./auto_deploy_app_remote.py -k

# 第八布,启动业务平台
./auto_deploy_app_remote.py -t

注:第七步可以使用「./auto_deploy_app_remote.py -g」代替,第八步可以使用「./auto_deploy_app_remote.py -r」代替。

如果您是使用该脚本更新项目,请依次执行如下命令:

# 第一步,如有需要,编辑配置文件;
vim config.conf

# 第二步,显示帮助;
./auto_deploy_app_remote.py -h

# 第三步,更新项目;
./auto_deploy_app_remote.py -u

# 第四步,关闭认证平台;
./auto_deploy_app_remote.py -a

# 第五步,关闭业务平台
./auto_deploy_app_remote.py -s

# 第六步,部署业务平台;
./auto_deploy_app_remote.py -d

# 第七步,部署认证平台;
./auto_deploy_app_remote.py -w

# 第八步,启动认证平台
./auto_deploy_app_remote.py -k

# 第九布,启动业务平台
./auto_deploy_app_remote.py -t

注:第八步可以使用「./auto_deploy_app_remote.py -g」代替,第九步可以使用「./auto_deploy_app_remote.py -r」代替。

7.GitHub地址

python-auto-deploy:https://github.com/dbarobin/python-auto-deploy

8.作者信息

温国兵

  • Robin Wen
  • Gmail:dbarobinwen@gmail.com
  • CSDN:http://blog.csdn.net/justdb
  • GitHub:https://github.com/dbarobin

Python自动化打包业务和认证平台