批量同步代碼:有3臺服務器(A,B,C)做負載均衡,由於規模太小目前並未使用專業的自動化運維工具
一個業務,有3臺服務器(A,B,C)做負載均衡,由於規模太小目前並未使用專業的自動化運維工具。有新的需求時,開發同事改完代碼會把變更上傳到其中一臺服務器A上。但是其他2臺服務器也需要做相同變更。
寫一個shell腳本,把A服務器上的變更代碼同步到B和C上。
其中,你需要考慮到不需要同步的目錄(假如有tmp、upload、logs、caches)
#!/bin/bash echo "該腳本將會把A機器上的/data/wwwroot/www.aaa.com目錄同步到B、C機器上" read -p "是否要繼續(y|n)" rs() { rsync -azP \ #“\”,表示使行得以繼續,命令可以繼續正常輸入 --exclude logs --exclude upload --exclude caches --exclude tmp www.aaa.com/ $1:/data/wwwroot/www.aaa.com } if [ $REPLY == 'y' -o $REPLY == 'Y' ] then echo "即將同步... ..." sleep 2 cd /data/wwwroot/ rs [email protected] #B機器ip,格式:用戶名@ip rs [email protected] #C機器ip,格式:用戶名@ip echo "同步完成。" elif [ $REPLY == 'n' -o $REPLY == 'N' ] then exit 1 else echo "請輸入字母y或者n" fi
解析:rs() { }是函數,由{}包圍的命令構成了一個代碼塊,也就是函數體。通過使用花括號{}包圍命令,可以使各種用途的命令關聯在一起,構成一個整體。調用函數時,裏面的命令會作為一個整體一起執行。
調用函數直接使用函數名像普通命令一樣使用,直接這裏直接使用rs,表示除了logs、upload、caches、tmp目錄,將www.aaa.com下的文件同步到$1主機下的/data/wwwroot/www.aaa.com
rsync命令是一個遠程數據同步工具,格式為:rsync [OPTION]... SRC [USER@]host:DEST。 -a選項表示以遞歸方式傳輸文件,並保持所有文件的屬性。-z選項表示對備份的文件在傳輸時進行壓縮處理,-P選項 等同於 --partial選項,表示保留那些因故沒有完全傳輸的文件,以加快隨後的再次傳輸。--exclude選項表示指定排除不需要傳輸的文件,可以是萬用字符模式(如*.txt)
而需要特別說明的是,rsync -azP www.aaa.com/ [email protected]:/data/wwwroot 本地目錄(www.aaa.com)的後面如果不加"/",則會把www.aaa.com這個目錄以及目錄下的文件一同同步,如果不加“/”,則只會同步目錄下的文件,不會同步目錄本身。
函數體裏面有集合命令後面用了反斜杠“\”,表示使行得以繼續,命令可以繼續正常輸入,也就是函數體中的每行命令使用“\”,將其連接為一條命令。
這裏有個變量$REPLY,為環境變量。在read命令行中,如果不指定變量,那麽read命令會將接收到的數據放置在環境變量REPLY中。環境變量REPLY中包含最後一次輸入的所有數據,可以像使用其他變量一樣在shell腳本中使用環境變量REPLY.
if判斷的含義是:如果read輸入的變量值為"y"或者"Y",則依次輸出“正在同步”,延遲2秒,進入/data/wwwroot/,執行函數體,輸出“同步完成”,如果read 輸入的變量值為"n"或"N",則退出,否則(以上兩種情況都不存在),則輸出請輸入字母y或者n
sleep 2 表示延遲2秒
批量同步代碼:有3臺服務器(A,B,C)做負載均衡,由於規模太小目前並未使用專業的自動化運維工具