今天痛下決心,把事務的工作一定要使用平臺來做,時間短,任務緊,之前的運維開發是鋪了一個面,每個面都做一些相關的事情,所以工作整體看都有進展,但是最後沒有一個專注的功能。
所以我就在想到底是怎麼回事,我能不能專注一些,哪怕就實現一個簡單的功能,把它做好做透,其他的功能是不是能夠同樣複製很多的思想。於是乎,上班後我開始整理自己的思路,一邊問自己,一邊回答,每個回答都對應兩列,一個是需要做的改進(action),還有一個是這個action的預估時間。結果幾分鐘下來,我發現如果理想的情況下,我只需要2個小時就能搞定,這麼一想,還是能接受的,於是對需要做的事情排了一個順序,立馬開幹。
我的設計是使用運維平臺連線中控伺服器來級聯觸發遠端操作,這樣運維平臺對所有環境的耦合性是最低的。
哪怕是最簡陋的操作,也要咬著牙完成,於是大體是這樣的流程,上午的時候有兩個部署需求,下午有兩個,第一個是在半除錯狀態下完成的,第二個開始做指令碼的模組化整理,是一個半自動的過程,然後發現了一些問題,非常糾結的去修復歷史部署問題,等到第三個需求的時候,明顯好了許多,到了第四個,就可以一口氣完成了,流程打通了,細節就可以打磨了。
於是我對有的指令碼的邏輯進行改造,有一個很通用的需求,假設指令碼是initdb.sh要呼叫這個指令碼需要輸入一系列的引數,比如有5個引數。
這個指令碼里面有10個步驟,每個步驟都是使用function來實現的。如果要處理這5個引數,同時能夠控制10個步驟的執行,比如第2步不執行,第3步執行。指令碼中其實還是比較難以管理和實現的。
我設想了幾種實現思路:
1)把10個步驟拆分成10個指令碼,然後每個指令碼都有自己的呼叫方式,獨立控制
2)寫一個配置指令碼,比如main.sh然後在這個指令碼里控制initdb.sh的執行情況
第二種看起來好一些,但是問題還是沒有解決,因為引數怎麼管理,10個步驟怎麼處理還是得細化。
我的初步設想是5個引數,外帶一個引數即可,前面五個引數和一個步驟的引數。
預期執行情況大體如下:
# sh a.sh x x x x x 'init1 init3 init2'
init1
init3
init2
即執行的時候是按照init1 init3 init2的方式執行的。
關鍵程式碼如下:
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[*]}"
執行結果如下:
[root@dev01 test]# sh a.sh 'init1 init3 init2'
test init1
init1
test init3
init3
test init2
init2
這裡有個問題,那就是我們輸入的操作步驟可能是無序的,但是執行的時候是希望按照順序,比如步驟2是依賴於步驟1的,這個我們是明確的。如果要實現這樣一個需求,就需要額外的一些補充,那就是排序功能,或者是前端傳入的時候來控制更好。
沒事,能者多勞,我們就先實現了。保證能正確的執行起來,於是程式碼又開始一通改動。
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[*]}"
假設正確的步驟我們改為了init3 init1 init2,傳入引數為init1 init3 init2,如果能夠轉換,幸福感就大大提高了。
指令碼的執行結果如下:
[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
可見是達到了預期的目標了,所以這個思路可以借鑑,在其他的地方也可以參考使用。