需求背景是:linux
一個業務,有3臺服務器(A,B,C)作負載均衡,因爲規模過小目前並未使用專業的自動化運維工具。有新的需求時,開發同事改完代碼會把變動上傳到其中一臺服務器A上。可是其餘2臺服務器也須要作相同變動。shell
寫一個shell腳本,把A服務器上的變動代碼同步到B和C上。bash
其中,你須要考慮到不須要同步的目錄(假若有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 root@192.168.232.4 #B機器ip,格式:用戶名@ip rs root@192.168.232.5 #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
ide
rsync命令是一個遠程數據同步工具,格式爲:rsync [OPTION]... SRC [USER@]host:DEST。 -a選項表示以遞歸方式傳輸文件,並保持全部文件的屬性。-z選項表示對備份的文件在傳輸時進行壓縮處理,-P選項 等同於 --partial選項,表示保留那些因故沒有徹底傳輸的文件,以加快隨後的再次傳輸。--exclude選項表示指定排除不須要傳輸的文件,能夠是萬用字符模式(如*.txt)函數
而須要特別說明的是,rsync -azP www.aaa.com/ root@192.168.232.2:/data/wwwroot 本地目錄(www.aaa.com)的後面若是不加"/",則會把www.aaa.com這個目錄以及目錄下的文件一同同步,若是不加「/」,則只會同步目錄下的文件,不會同步目錄自己。
工具
函數體裏面有集合命令後面用了反斜槓「\」,表示使行得以繼續,命令能夠繼續正常輸入,也就是函數體中的每行命令使用「\」,將其鏈接爲一條命令。spa
這裏有個變量$REPLY,爲環境變量。在read命令行中,若是不指定變量,那麼read命令會將接收到的數據放置在環境變量REPLY中。環境變量REPLY中包含最後一次輸入的全部數據,能夠像使用其餘變量同樣在shell腳本中使用環境變量REPLY.
if判斷的含義是:若是read輸入的變量值爲"y"或者"Y",則依次輸出「正在同步」,延遲2秒,進入/data/wwwroot/,執行函數體,輸出「同步完成」,若是read 輸入的變量值爲"n"或"N",則退出,不然(以上兩種狀況都不存在),則輸出請輸入字母y或者n
sleep 2 表示延遲2秒