使用shell腳本實現php應用的批量更新

拓撲:php

control_servernginx

192.168.1.200web

 

lb1正則表達式

192.168.1.202shell

 

lamp1apache

192.168.1.101bash

 

lamp2服務器

192.168.1.102app

 

網站:ssh

www.aaa.com

 

注意點:

1.全部服務器之間經過hosts來解析主機名

2.control_server與其餘被管理主機基於密鑰方式進行ssh通訊

3.全部服務器的ssh端口號已改成2222

 

實驗目的:

基於灰度發佈模型,在control_server上使用shell腳本,自動向多臺lamp服務器發佈新版本的php應用

 

實現思路:

  1. 各服務器上的配置文件以及文件路徑要保持一致

  2. 更新web應用時,使用軟連接的方式來實現。若是新版本有嚴重BUG,方便回滾到舊版本

wKiom1ikWnTwdGhYAAD5tPW8HLQ061.jpg

 

  1. Load Balance上的nginx配置要規範:

   不一樣的站點使用獨立的配置文件

wKioL1ikWpHzIMLpAACSoq9Ty_w334.jpg

 

    配置upstream時能夠自定義標記,方便正則表達式匹配

wKioL1ikWq6QU-nBAACGQX7W2jw660.jpg

 

 

具體實現過程:

  1. 向lamp1傳送項目包

  2. 修改全部Load Balance節點的nginx配置文件,標記lamp1服務器爲down,使新的請求不會再發往lamp1,並重載nginx

  3. 腳本等待1分鐘,讓lamp1處理完已接收的請求

  4. 將網站目錄的軟鏈接指向新版本,並重載httpd

  5. 從新修改全部Load Balance節點的nginx配置文件,取消lamp1服務器的down標記,並重載nginx

  6. 以此類推,向其餘lamp服務器更新web應用

  7. 腳本執行完畢後,列出執行過程當中發生異常的lamp服務器列表,以後能夠對這些服務器進行進一步的人工檢查及更新

 

 

使用方法:

wKiom1ikWseQ3e2VAABpN2e1Vm8057.jpg

 

wKioL1ikWuPzVUUJAABC4LldKNM265.jpg

 

 

 

腳本:

#!/bin/bash
#
 
read -p "請輸入項目包路徑:" webappPath
#壓縮項目文件,便於傳輸
webappName=`basename ${webappPath}`
webappPackage=/tmp/${webappName}.tar.gz
 
#web服務器存放網站的路徑以及web服務的用戶名,每一個服務器的配置須要統一
remoteWebappPath=/data/webapps
remoteWebUser=apache
 
#相應網站的nginx配置文件路徑
nginxConfPath=/etc/nginx/conf.d/www_aaa_com.conf
 
remoteSSHport=2222
 
tar -czf ${webappPackage} ${webappPath}&> /dev/null
[ $? -ne 0 ] && echo "tarwrong" && exit 1
 
#Load Balance服務器列表
lbServers=(lb1)
 
#Lamp服務器列表
lampServers=(lamp1 lamp2)
 
#更新過程當中發生異常的服務器列表
declare -a failureServers
 
check()
{
   if [ $? -ne 0 ]; then
       failureServers[${#failureServers[@]}]=$1
       continue
   fi
}
 
for lampServer in ${lampServers[@]}; do
   scp -P ${remoteSSHport} ${webappPackage} ${lampServer}:/tmp &>/dev/null
   check ${lampServer}
 
   ssh -p ${remoteSSHport} ${lampServer} tar -xf /tmp/${webappName}.tar.gz-C /data/webapps
   check ${lampServer}
 
   ssh -p ${remoteSSHport} ${lampServer} chown -R${remoteWebUser}:${remoteWebUser} /data/webapps/${webappName}
   check ${lampServer}
   
   declare -i flag=0
   for lbServer in ${lbServers}; do
       ssh -p ${remoteSSHport} ${lbServer} "grep'[^[:space:]].*;.*#${lampServer}\>' $nginxConfPath &> /dev/null"
       check ${lampServer}
 
       ssh -p ${remoteSSHport} ${lbServer} "sed -i -r 's@([^[:space:]].*);(.*#'"${lampServer}"'\>)@\1 down;\2@'${nginxConfPath}"
       check ${lampServer}
          
       ssh -p ${remoteSSHport} ${lbServer} "nginx -s reload"
       check ${lampServer}
       
       let flag+=1
   done
   [ $flag -ne ${#lbServers[@]} ] && failureServers[${#failureServers[@]}]=${lampServer} && continue
   
   sleep 1m
   ssh -p ${remoteSSHport} ${lampServer} "rm -f/data/webapps/aaa"
   check ${lampServer}
 
   ssh -p ${remoteSSHport} ${lampServer} "ln -s/data/webapps/${webappName} /data/webapps/aaa"
   check ${lampServer}
 
   ssh -p ${remoteSSHport} ${lampServer} "service httpd reload&> /dev/null"    
   check ${lampServer}
 
   flag=0
   for lbServer in ${lbServers}; do
       ssh -p ${remoteSSHport} ${lbServer} "grep'[^[:space:]].*down;.*#${lampServer}\>' $nginxConfPath &>/dev/null"
       check ${lampServer}
 
       ssh -p ${remoteSSHport} ${lbServer} "sed -i -r 's@([^[:space:]].*)[[:space:]]down;(.*#'"${lampServer}"'\>)@\1;\2@'${nginxConfPath}"
       check ${lampServer}
          
       ssh -p ${remoteSSHport} ${lbServer} "nginx -s reload"
       check ${lampServer}
       
       let flag+=1
   done
   [ $flag -ne ${#lbServers[@]} ] && failureServers[${#failureServers[@]}]=${lampServer}
 
   ssh -p ${remoteSSHport} ${lampServer} "rm -f/tmp/${webappName}.tar.gz"
 
done
 
rm -f ${webappPackage}
echo "任務執行完成"
 
if [ ${#failureServers[@]} -gt 0 ]; then
   echo
   echo "下列服務器未能正常更新,請進一步檢查:"
   for failureServer in ${failureServers[@]}; do
       echo ${failureServer}
   done
fi
相關文章
相關標籤/搜索