今天痛下決心,把事務(wù)的工作一定要使用平臺(tái)來(lái)做,時(shí)間短,任務(wù)緊,之前的運(yùn)維開發(fā)是鋪了一個(gè)面,每個(gè)面都做一些相關(guān)的事情,所以工作整體看都有進(jìn)展,但是最后沒有一個(gè)專注的功能。
所以我就在想到底是怎么回事,我能不能專注一些,哪怕就實(shí)現(xiàn)一個(gè)簡(jiǎn)單的功能,把它做好做透,其他的功能是不是能夠同樣復(fù)制很多的思想。于是乎,上班后我開始整理自己的思路,一邊問自己,一邊回答,每個(gè)回答都對(duì)應(yīng)兩列,一個(gè)是需要做的改進(jìn)(action),還有一個(gè)是這個(gè)action的預(yù)估時(shí)間。結(jié)果幾分鐘下來(lái),我發(fā)現(xiàn)如果理想的情況下,我只需要2個(gè)小時(shí)就能搞定,這么一想,還是能接受的,于是對(duì)需要做的事情排了一個(gè)順序,立馬開干。
我的設(shè)計(jì)是使用運(yùn)維平臺(tái)連接中控服務(wù)器來(lái)級(jí)聯(lián)觸發(fā)遠(yuǎn)程操作,這樣運(yùn)維平臺(tái)對(duì)所有環(huán)境的耦合性是最低的。
哪怕是最簡(jiǎn)陋的操作,也要咬著牙完成,于是大體是這樣的流程,上午的時(shí)候有兩個(gè)部署需求,下午有兩個(gè),第一個(gè)是在半調(diào)試狀態(tài)下完成的,第二個(gè)開始做腳本的模塊化整理,是一個(gè)半自動(dòng)的過程,然后發(fā)現(xiàn)了一些問題,非常糾結(jié)的去修復(fù)歷史部署問題,等到第三個(gè)需求的時(shí)候,明顯好了許多,到了第四個(gè),就可以一口氣完成了,流程打通了,細(xì)節(jié)就可以打磨了。
于是我對(duì)有的腳本的邏輯進(jìn)行改造,有一個(gè)很通用的需求,假設(shè)腳本是initdb.sh要調(diào)用這個(gè)腳本需要輸入一系列的參數(shù),比如有5個(gè)參數(shù)。
這個(gè)腳本里面有10個(gè)步驟,每個(gè)步驟都是使用function來(lái)實(shí)現(xiàn)的。如果要處理這5個(gè)參數(shù),同時(shí)能夠控制10個(gè)步驟的執(zhí)行,比如第2步不執(zhí)行,第3步執(zhí)行。腳本中其實(shí)還是比較難以管理和實(shí)現(xiàn)的。
我設(shè)想了幾種實(shí)現(xiàn)思路:
1)把10個(gè)步驟拆分成10個(gè)腳本,然后每個(gè)腳本都有自己的調(diào)用方式,獨(dú)立控制
2)寫一個(gè)配置腳本,比如main.sh然后在這個(gè)腳本里控制initdb.sh的執(zhí)行情況
第二種看起來(lái)好一些,但是問題還是沒有解決,因?yàn)閰?shù)怎么管理,10個(gè)步驟怎么處理還是得細(xì)化。
我的初步設(shè)想是5個(gè)參數(shù),外帶一個(gè)參數(shù)即可,前面五個(gè)參數(shù)和一個(gè)步驟的參數(shù)。
預(yù)期執(zhí)行情況大體如下:
# sh a.sh x x x x x 'init1 init3 init2'
init1
init3
init2
即執(zhí)行的時(shí)候是按照init1 init3 init2的方式執(zhí)行的。
關(guān)鍵代碼如下:
function init1(){
echo 'init1'
}
function init2(){
echo 'init2'
}
function init3(){
echo 'init3'
}
function initdb(){
arr=$1
for fun in ${arr[*]}; do
echo $i
case $fun in
init1)
echo "test init1"
init1
;;
init2)
echo "test init2"
init2
;;
init3)
echo "test init3"
init3
;;
*)
echo "out of scope"
esac
done
}
init_par=$1
actions=($init_par)
initdb "${actions[*]}"
執(zhí)行結(jié)果如下:
[root@dev01 test]# sh a.sh 'init1 init3 init2'
test init1
init1
test init3
init3
test init2
init2
這里有個(gè)問題,那就是我們輸入的操作步驟可能是無(wú)序的,但是執(zhí)行的時(shí)候是希望按照順序,比如步驟2是依賴于步驟1的,這個(gè)我們是明確的。如果要實(shí)現(xiàn)這樣一個(gè)需求,就需要額外的一些補(bǔ)充,那就是排序功能,或者是前端傳入的時(shí)候來(lái)控制更好。
沒事,能者多勞,我們就先實(shí)現(xiàn)了。保證能正確的運(yùn)行起來(lái),于是代碼又開始一通改動(dòng)。
function init1(){
echo 'init1'
}
function init2(){
echo 'init2'
}
function init3(){
echo 'init3'
}
function initdb(){
arr=$1
complete_arr=(init3 init1 init2)
order_arr=()
for act_tmp in ${complete_arr[*]}; do
if [[ " ${arr[@]} " =~ " $act_tmp " ]];then
echo $act_tmp
order_arr[${#order_arr[@]}]=$act_tmp
echo order_arr[${#order_arr[@]}]
fi
done
for fun in ${order_arr[*]}; do
echo $i
case $fun in
init1)
echo "test init1"
init1
;;
init2)
echo "test init2"
init2
;;
init3)
echo "test init3"
init3
;;
*)
echo "out of scope"
esac
done
}
init_par=$1
actions=($init_par)
initdb "${actions[*]}"
假設(shè)正確的步驟我們改為了init3 init1 init2,傳入?yún)?shù)為init1 init3 init2,如果能夠轉(zhuǎn)換,幸福感就大大提高了。
腳本的執(zhí)行結(jié)果如下:
[root@dev01 test]# sh aa.sh 'init1 init3 init2'
init3
order_arr[1]
init1
order_arr[2]
init2
order_arr[3]
test init3
init3
test init1
init1
test init2
init2
可見是達(dá)到了預(yù)期的目標(biāo)了,所以這個(gè)思路可以借鑒,在其他的地方也可以參考使用。