標籤:使用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應用
實現思路:
各伺服器上的設定檔以及檔案路徑要保持一致
更新web應用時,使用軟連結的方式來實現。如果新版本有嚴重BUG,方便復原到舊版本
650) this.width=650;" src="https://s1.51cto.com/wyfs02/M00/8D/A4/wKiom1ikWnTwdGhYAAD5tPW8HLQ061.jpg" title="b.JPG" alt="wKiom1ikWnTwdGhYAAD5tPW8HLQ061.jpg" />
Load Balance上的nginx配置要規範:
① 不同的網站使用獨立的設定檔
650) this.width=650;" src="https://s4.51cto.com/wyfs02/M00/8D/A1/wKioL1ikWpHzIMLpAACSoq9Ty_w334.jpg" title="b.JPG" alt="wKioL1ikWpHzIMLpAACSoq9Ty_w334.jpg" />
② 配置upstream時可以自訂標籤,方便Regex匹配
650) this.width=650;" src="https://s5.51cto.com/wyfs02/M00/8D/A1/wKioL1ikWq6QU-nBAACGQX7W2jw660.jpg" title="b.JPG" alt="wKioL1ikWq6QU-nBAACGQX7W2jw660.jpg" />
具體實現過程:
向lamp1傳送項目包
修改所有Load Balance節點的nginx設定檔,標記lamp1伺服器為down,使新的請求不會再發往lamp1,並重載nginx
指令碼等待1分鐘,讓lamp1處理完已接收的請求
將網站目錄的軟串連指向新版本,並重載httpd
重新修改所有Load Balance節點的nginx設定檔,取消lamp1伺服器的down標記,並重載nginx
以此類推,向其他lamp伺服器更新web應用
指令碼執行完畢後,列出執行過程中發生異常的lamp伺服器列表,之後可以對這些伺服器進行進一步的人工檢查及更新
使用方法:
650) this.width=650;" src="https://s4.51cto.com/wyfs02/M01/8D/A4/wKiom1ikWseQ3e2VAABpN2e1Vm8057.jpg" title="b.JPG" alt="wKiom1ikWseQ3e2VAABpN2e1Vm8057.jpg" />
650) this.width=650;" src="https://s5.51cto.com/wyfs02/M01/8D/A1/wKioL1ikWuPzVUUJAABC4LldKNM265.jpg" title="b.JPG" alt="wKioL1ikWuPzVUUJAABC4LldKNM265.jpg" />
指令碼:
#!/bin/bash# read -p "請輸入項目包路徑:" webappPath#壓縮專案檔,便於傳輸webappName=`basename ${webappPath}`webappPackage=/tmp/${webappName}.tar.gz #web伺服器存放網站的路徑以及web服務的使用者名稱,每個伺服器的配置需要統一remoteWebappPath=/data/webappsremoteWebUser=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‘[email protected]([^[:space:]].*);(.*#‘"${lampServer}"‘\>)@\1 down;\[email protected]‘${nginxConfPath}" check ${lampServer} ssh -p ${remoteSSHport} ${lbServer} "nginx -s reload" check ${lampServer} let flag+=1 done [ $flag -ne ${#lbServers[@]} ] &&failureServers[${#failureServers[@]}]=$1 && 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‘[email protected]([^[:space:]].*)[[:space:]]down;(.*#‘"${lampServer}"‘\>)@\1;\[email protected]‘${nginxConfPath}" check ${lampServer} ssh -p ${remoteSSHport} ${lbServer} "nginx -s reload" check ${lampServer} let flag+=1 done [ $flag -ne ${#lbServers[@]} ] &&failureServers[${#failureServers[@]}]=$1 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} donefi
使用shell指令碼實現php應用的批次更新