1. 程式人生 > >批量同步代碼:有3臺服務器(A,B,C)做負載均衡,由於規模太小目前並未使用專業的自動化運維工具

批量同步代碼:有3臺服務器(A,B,C)做負載均衡,由於規模太小目前並未使用專業的自動化運維工具

rda 屬性。 環境變量 再次 由於 執行 http sleep 依次

需求背景是:

一個業務,有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)做負載均衡,由於規模太小目前並未使用專業的自動化運維工具