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

需求背景是: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秒

相關文章
相關標籤/搜索