案例二10、自動化運維-代碼上線

在案例十六中已經介紹過expect腳本的使用,能夠遠程登陸機器並執行命令,其實expect腳本也能夠傳輸文件。本案例的需求就是經過expect腳原本同步文件,從而實現代碼上線。生產環境中一個業務一般跑在多臺服務器上,也就是負載均衡,因此這些機器上運行的代碼必需要保持一致。怎麼實現一致?有兩種方案。web

一、經過共享的方式shell

若是機器量很少,可使用NFS實現,若是要求穩定性最好是使用專業的存儲設備(NAS、SAN等),這種方式架構以下:bash

1.png

這種架構的優勢是方便維護,好比有代碼更新時,只須要更新一臺機器上的代碼,則其餘機器上都會跟着更新。缺點是,機器量大的話,共享存儲會成爲瓶頸,甚至因爲對文件的爭搶形成性能問題。還有一點,共享存儲這裏是一個很大的單點隱患,不出故障一切都OK,一旦出故障,則整個業務都掛掉,影響很是大。服務器

二、分佈式架構

既然經過共享的方式有很多缺點,那麼就選擇另一種方式,即把代碼存到每一臺web服務器的本地磁盤上,如圖所示:負載均衡

f966abb6f4d9b650a68cba8e02ec4449.png

這樣作的好處是,沒有存儲性能問題,沒有資源爭搶衝突,也沒有單點故障的隱患。缺點是,每次代碼更新須要對全部web服務器就行更新,比較繁瑣。雖然步驟繁瑣,但大多數企業都會選擇該方式。本案例的背景就是第二種方式,具體要求以下:ssh

1)提供一個全部web服務器的IP列表ip.list。分佈式

2)假設全部web服務器上有一個普通用戶user01,密碼爲SGs2ox6uj,該用戶爲同步代碼的用戶。ide

3)每次代碼上線會提供一個文件列表file.list(即要更改的文件列表)。工具


知識點一:rsync同步文件經過文件列表

rsync這個同步文件的工具雖然在前面案例出現過,但經過一個文件列表來同步文件並不常見,先看示例:

# cat 1.txt 
/tmp/123/1.sh
/root/test/a.txt
/etc/passwd

# rsync -av --files-from=./1.txt  /  root@192.168.93.130:/

說明:1.txt爲一個文件列表,即要同步的文件列表;rsync的--files-from選項指定要同步文件的列表文件(1.txt的路徑,能夠是絕對路徑,也能夠是相對路徑),這個文件列表內容其實就是一堆文件路徑,這個路徑建議用絕對路徑,否則會出錯;若是文件列表中的文件路徑爲絕對路徑,則rsync的源目錄必須爲/,目標目錄也必須爲/。


知識點二:expect腳本同步文件

跟遠程執行命令相似,expect腳本要想同步文件,spawn後面的shell命令再也不是ssh,而是rsync,示例:

#!/usr/bin/expect
set passwd "SGs2ox6uj"
set host "192.168.93.130"
spawn rsync -a  user01@$host:/tmp/test.txt /tmp/
expect {
    "yes/no" {send "yes\r"}
    "password:" {send "$passwd\r"}
}
expect eof

也能夠傳遞參數給expect腳本,示例:
#!/usr/bin/expect
set passwd "SGs2ox6uj"
set host [lindex $argv 0]
set file [lindex $argv 1]
spawn rsync -a --files-from=$file  / user01@$host:/
expect {
    "yes/no" {send "yes\r"}
    "password:" {send "$passwd\r"}
}
expect eof


本案例參考腳本

#/bin/bash
##代碼上線
##做者:
##日期:

#提醒用戶,是否更新了要上線的代碼列表文件
read -p "你是否已經更新了文件列表./file.list?確認請輸入y或者Y,不然按其餘任意鍵退出腳本。" c

#若是直接按回車,也會退出腳本
if [ -z "$c" ]
then
    exit 1
fi

if [ $c == "y" -o $c == "Y" ]
then
    echo "腳本將在2秒後,繼續執行。"
    #每秒輸出一個.共輸出兩個.
    for i in 1 2
    do
        echo -n "."
        sleep 1
    done
    echo
else
    exit 1
fi

#判斷有無./rsync.exp文件
[ -f ./rsync.exp ] && rm -f ./rsync.exp

#定義rsync.exp
cat >./rsync.exp <

說明:要想在生產環境中使用該腳本,須要先提早建立一個user01用戶,而且保證user01用戶對web服務器上代碼所在目錄有寫權限。

相關文章
相關標籤/搜索