1. 程式人生 > 實用技巧 >使用shell指令碼實現php應用的批量更新

使用shell指令碼實現php應用的批量更新

拓撲:

control_server

192.168.1.200

lb1

192.168.1.202

lamp1

192.168.1.101

lamp2

192.168.1.102

網站:

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
[$?-ne0]&&echo"tarwrong"&&exit1

#LoadBalance伺服器列表
lbServers=(lb1)

#Lamp伺服器列表
lampServers=(lamp1lamp2)

#更新過程中發生異常的伺服器列表
declare-afailureServers

check()
{
if[$?-ne0];then
failureServers[${#failureServers[@]}]=$1
continue
fi
}

forlampServerin${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-iflag=0
forlbServerin${lbServers};do
ssh-p${remoteSSHport}${lbServer}"grep'[^[:space:]].*;.*#${lampServer}\>'$nginxConfPath&>/dev/null"
check${lampServer}

ssh-p${remoteSSHport}${lbServer}"sed-i-r'
[email protected]
([^[:space:]].*);(.*#'"${lampServer}"'\>)@\1down;\[email protected]'${nginxConfPath}" check${lampServer} ssh-p${remoteSSHport}${lbServer}"nginx-sreload" check${lampServer} letflag+=1 done [$flag-ne${#lbServers[@]}]&&failureServers[${#failureServers[@]}]=${lampServer}&&continue sleep1m 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}"servicehttpdreload&>/dev/null" check${lampServer} flag=0 forlbServerin${lbServers};do ssh-p${remoteSSHport}${lbServer}"grep'[^[:space:]].*down;.*#${lampServer}\>'$nginxConfPath&>/dev/null" check${lampServer} ssh-p${remoteSSHport}${lbServer}"sed-i-r'[email protected]([^[:space:]].*)[[:space:]]down;(.*#'"${lampServer}"'\>)@\1;\[email protected]'${nginxConfPath}" check${lampServer} ssh-p${remoteSSHport}${lbServer}"nginx-sreload" check${lampServer} letflag+=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[@]}-gt0];then echo echo"下列伺服器未能正常更新,請進一步檢查:" forfailureServerin${failureServers[@]};do echo${failureServer} done fi


轉載於:https://blog.51cto.com/362475097/1898231