Python自動化打包業務和認證平臺

Wentasy發表於2014-11-29

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.&##39;)
    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("quot;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.作者資訊

溫國兵

相關文章