References:
【1】 http://python.jobbole.com/87241/
1. Introduction to Fabric:
Fabric is a Python library that provides a rich interface for interacting with SSH, which can be used to automate and streamline the execution of Shell commands on local or remote machines. Therefore, it is very suitable for remote deployment and system maintenance of applications. It is also extremely easy to get started, all you need is to know the basic shell commands.
2. Fabric installation:
#!/bin/bash #create by huangdengji #version:1.0 #create time:2017-09-27 15:22:00 #email:[email protected] #description: install fabric #1.install python2.7.14 #2.install pip #3.install fabric set -m #install dependencies yum -y install wget gcc openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel cd /home/hdj/ [ -d /home/hdj/fabric ] && { rm -rf /home/hdj/fabric } mkdir fabric cd fabric #Install Python2.7 wget https://www.python.org/ftp/python/2.7.14/Python-2.7.14.tgz tar -xvf Python-2.7.14.tgz cd Python-2.7.14 ./configure --prefix=/usr/local/python2.7 make make install /usr/local/python2.7/bin/python2.7 -V [$? -ne 0] && { echo 'python 2.7 install fail' exit 1 } ln -fs /usr/local/python2.7/bin/python2.7 /usr/bin/python #Since yum depends on Python2.6, the yum file needs to be modified yumFirstLine=`head -n 1 /usr/bin/yum` [ ${#yumFirstLine} -eq 17 ] && { sed -i 's#/usr/bin/python#/usr/bin/python2.6#g' /usr/bin/yum echo 'modify /usr/bin/yum first line to /usr/bin/python2.6' } echo '------------------------------------------------------------------------------------------------------------------' echo '' echo '' echo '' echo '' echo '' echo 'python 2.7 install success' echo '' echo '' echo '' echo '' echo '' echo '------------------------------------------------------------------------------------------------------------------' #install pip cd .. wget https://bootstrap.pypa.io/get-pip.py python get-pip.py ln -s /usr/local/python2.7/bin/pip /usr/bin/pip #install fabric pip install fabric ln -s /usr/local/python2.7/bin/fab /usr/bin/fab echo '------------------------------------------------------------------------------------------------------------------' echo '' echo '' echo '' echo '' echo '' echo 'fab install success' echo '' echo '' echo '' echo '' echo '' echo '------------------------------------------------------------------------------------------------------------------'
3. Write a local packaging shell script
#!/bin/bash #create by huangdengji #version:2.0 #create time:2017-09-25 18:22:00 #email:[email protected] #description:do repackage project to tar.gz set -m projectName="ROOT" tomcatDir="/resources/apache-tomcat-6.0.41/webapps/" cd ${tomcatDir} rm -rf ${projectName}.tar.gz tar -zcf ${projectName}.tar.gz ${projectName}
4. Write a shell script that redeploys the project in the remote server
#!/bin/bash #create by huangdengji #version:1.0 #create time:2017-09-12 18:22:00 #email:[email protected] #description:do reploy tomcat project set -m source /etc/profile tomcatName='apache-tomcat-6.0.41' projectName='ROOT' deployEndTag='.tar.gz' deployName=${projectName}${deployEndTag} projectDir='/u0/'${tomcatName}'/webapps/' # str = `ps -ef | grep $ {tomcatName} ` str = `ps -ef | grep $ {tomcatName} | grep -v grep | grep -v tail` pid=`echo $str | awk '{print $2}'` echo ${tomcatName}' pid:'${pid} [ -f /home/hdj/${deployName} ] || { echo '/home/hdj/'${deployName}' not exist' exit 1 } kill -9 ${pid} if [ $? -eq 0 ] then echo "kill tomcat success!" else echo "kill tomcat fail!" be sleep 3 while true do count = `ps -ef | grep $ {tomcatName} | grep -v grep | grep -v tail | wc -l` [ ${count} -eq 0 ] && { break } && { kill -9 ${pid} sleep 1 } done #path='/project_bak/'$(date +%Y%m%d%H%M) path='/project_bak/' if [ -d ${path} ] then rm -rf ${path} mkdir -p ${path} else mkdir -p ${path} be if [ -d ${path} ] then echo 'created dir:'${path}' success!' else echo 'created dir:'${path}' fail!' exit 1 be if [ -d ${projectDir}${deployName} ] then mv ${projectDir}${deployName} ${path} if [ $? -eq 0 ] then echo 'project back to dir:'${path}' success!' else echo 'project back to dir:'${path}' fail!' exit 1 be else echo ${projectDir}${deployName}' is first depoly' be mv /home/hdj/${deployName} ${projectDir} if [ $? -eq 0 ] then echo 'deplory project to dir:'${projectDir}' success!' else echo 'deplory project to dir:'${projectDir}' fail!' exit 1 be cd ${projectDir} rm -rf ${project} tar -zxf ${deployName} /u0/${tomcatName}/bin/startup.sh echo 'starting '${tomcatName}' ...'
5. Write the Python script executed by the fabric to realize multi-server: local code packaging, uploading to remote server, remote service restart
#!/usr/bin/env python # encoding: utf-8 from fabric.api import local,cd,run,env,put,sudo env.hosts=['[email protected]:22','[email protected]:22','[email protected]:22'] #Parameters used by ssh env.password = '111111' tomcatName='apache-tomcat-6.0.41' projectName='ROOT' def local_package(): local('sh /home/hdj/fab_task/repackage.sh') put('/resources/'+tomcatName+'/webapps/'+projectName+'.tar.gz', '/home/hdj/') def update_to_remote(): print "remote update" with cd('/home/hdj'): #cd is used to enter a directory run('sh redeploy.sh') #run for remote operation def update(): local_package() update_to_remote()
6. Execute the fab command to complete batch deployment
fab -f redeploy.py update