拓撲: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應用
實現思路:
各服務器上的配置文件以及文件路徑要保持一致
更新web應用時,使用軟連接的方式來實現。若是新版本有嚴重BUG,方便回滾到舊版本
Load Balance上的nginx配置要規範:
① 不一樣的站點使用獨立的配置文件
② 配置upstream時能夠自定義標記,方便正則表達式匹配
具體實現過程:
向lamp1傳送項目包
修改全部Load Balance節點的nginx配置文件,標記lamp1服務器爲down,使新的請求不會再發往lamp1,並重載nginx
腳本等待1分鐘,讓lamp1處理完已接收的請求
將網站目錄的軟鏈接指向新版本,並重載httpd
從新修改全部Load Balance節點的nginx配置文件,取消lamp1服務器的down標記,並重載nginx
以此類推,向其餘lamp服務器更新web應用
腳本執行完畢後,列出執行過程當中發生異常的lamp服務器列表,以後能夠對這些服務器進行進一步的人工檢查及更新
使用方法:
腳本:
#!/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