Linux 解決數量龐大wildfly容器啓動與中止的腳本

1、問題

因公司業務的發展,後臺架構的變動,致使測試環境(Linux)部署與管理困難成倍增加,duang的一下,增長N倍。進入正題說問題:web

 

問題1.  測試環境包含普通用戶環境、開發者用戶環境,原來只需2個Wildfly,現須要15*2,30個容器,啓動、中止、部署工做量巨大shell

1    app
2    appInterface
3    battle
4    friend
5    gexin
6    msg
7    online
8    passport
9    pay
10   push
11   support
12   union
13   upload
14   webInterface
15   webView

注:因公司以及其餘緣由,本文中的模塊名、環境、數量都進行了適當的修改,此處只舉例說明。bash

 

問題2.  後續模塊擴展與容器增減維護工做  架構

 

問題3.   部署包SVN的自動獲取,自動部署       app

問題4.   部署完畢郵件通知  

 

2、分析

1. 現狀

a. SVN源碼無權限,有固定目錄取轉測模塊WAR包,但須要根據轉測svn版本號取(最新的不必定是部署時轉測的模塊)svn

b. 轉測模塊不定,也許15個,也許二、3個測試

c. 15個模塊(即15個WAR包),兩環境(普通用戶、開發者用戶),須要30個容器優化

d. 根據轉測模塊,只須要中止對應模塊所在容器,無須全部模塊中止與啓動ui


2. 分析與方案肯定

1) 棄用Jenkins 

a.無須自動構建:公司其餘緣由,測試沒法得到SVN源碼權限進行自動構建,Jenkins的自動化部署。spa

b.不夠靈活:WAR的自動化部署,Jenkins雖可部署,但須要15個Job+,總體轉測時用1Job統一部署,如模塊轉測試則須要按每一個模塊(每一個Job)一一點擊
c.工做量未減小:研發轉測發佈固定目錄是以svn版本號發佈,在部署時已經可能最新的版本號是另外一個轉測模塊,所以須要取對應的版本號,每次改太麻煩,基本沒有減小工做量。


2) 選用Shell腳本 

a.腳本實現快速,隨時修改

b.容器的操做都是Linux(shell)命令

c.自動化部署也採用shell分發與檢測部署

d.郵件發送採用mail命令 

 

3、解決問題

1.wildfly統一命名規則

普通用戶環境:Formal-wildfly-模塊名

開發者環境:DEV-wildfly-模塊名 

Formal-wildfly-app
Formal-wildfly-appInterface
Formal-wildfly-battle
Formal-wildfly-friend
Formal-wildfly-gexin
...


DEV-wildfly-app
DEV-wildfly-appInterface
DEV-wildfly-battle
DEV-wildfly-friend
DEV-wildfly-gexin
...

 

2.模塊名稱列表: wildfly.list

app|app
appInterface|ae
battle|b
friend|f
gexin|g
msg|m
online|o
passport|pt
pay|pay
push|ph
support|st
union|un
upload|ud
webInterface|we
webView|ww

注意:

a.第一列爲模塊名,用於檢測wildfly容器,故須要嚴格注意大小寫

b.第二列爲啓動、中止、檢查腳本使用的參數縮寫

c.後續擴展增長模塊,只須要增長對應的容器,而後修改此文件加入模塊名便可,此處解決第2個問題


3.啓動Wildfly腳本(run_wildfly.sh)

# !/bin/bash
#
 Author:findyou
#
 Email:1968089885@qq.com

cDate=`date +%Y-%m-%d`
cTime=`date +%H:%M`
shellDIR= " /root/ shell/ "
wildfly_rootDir= " /data/ "
conf_file= " wildfly.list "
echo_tips= "        "
checkBoolean=0

#  檢測wildfly.list文件是否存在,不存在-則退出腳本執行
if [ ! -f ${shellDIR}${conf_file} ]; then
    echo  " Not Found : ${shellDIR}${conf_file} "
    exit 1
fi

#  讀wildfly.list文件
count_n=0
while read line;
do
    count_n=`expr ${count_n} + 1`                             # 統計模塊個數
    wildfly[$count_n]=`echo $line|cut -d  ' | ' -f 1`            # 獲到模塊名稱
    wildfly_quick[$count_n]=`echo $line|cut -d  ' | ' -f 2`      # 得到快捷命令
done < ${shellDIR}${conf_file}

#  腳本幫助提示,並退出腳本
help_tips(){
   echo  " eg: $0 [wildflyName|a] "
   echo  ""
   echo  " wildflyName: "
     for ((i=1; i<=${count_n}; i++));
    do
       echo  " ${echo_tips}${wildfly[$i]}|${wildfly_quick[$i]} "
       done
   echo  ""
   exit 1
}

#  若是檢測到沒有傳入參數,則執行help_tips方法,
if [ ! -n  " $1 " ] ; then
    help_tips
fi

#  將傳入的 模塊名稱 參數賦值給para_cmd
para_cmd=$1

#  休眠方法,用於啓動間隔
sleep_2(){
     # echo "${echo_tips}${echo_tips}Sleep 2 second!"
    sleep 2
}

#  循環啓動Wildfly方法
run_wildfly(){
echo  " Time : ${cDate} ${cTime} "
#  循環wildfly.list文件中的全部模塊,根據傳入參數,判斷執行相應的啓動
for ((i=1; i<=${count_n}; i++));
do 
#  根據腳本傳入的參數,啓動對應的容器,傳爲a則啓動全部容器。
if [  " ${para_cmd} " ==  " a " -o  " ${para_cmd} " ==  " ${wildfly[$i]} " -o  " ${para_cmd} " ==  " ${wildfly_quick[$i]} " ];then
    echo  " Start: ${wildfly[$i]} "
     # 檢查 普通用戶 對應容器的進程
    formal_pc=`ps -ef|grep  " Formal-wildfly-${wildfly[$i]}/ "|grep -v grep|wc -l`
         # 容器進程數,若是不爲0,則說明已啓動。反之則進行容器啓動
         if [ $formal_pc -ne 0  ] ; then
            echo  " ${echo_tips}${echo_tips}Failure: UAT is already running! " 
         else
            echo  " ${echo_tips}UAT Start.... "
             #  進入對應的容器,啓動容器
            cd ${wildfly_rootDir}Formal-wildfly-${wildfly[$i]}/bin
            nohup sh standalone.sh >/dev/null 2>&1 &
            echo  " ${echo_tips}Please Check file: ${wildfly_rootDir}Formal-wildfly-${wildfly[$i]}/standalone/log/server.log "
            sleep_2
        fi
        
     # 檢查 開發者用戶 對應容器的進程
    dev_pc=`ps -ef|grep  " Dev-wildfly-${wildfly[$i]}/ "|grep -v grep|wc -l`    
         if [ $dev_pc -ne 0 ] ; then
            echo  " ${echo_tips}${echo_tips}Failure: UAT-DEV is already running! " 
         else
            echo  " ${echo_tips}UAT-DEV Start.... "
            cd ${wildfly_rootDir}Dev-wildfly-${wildfly[$i]}/bin
            nohup sh standalone.sh >/dev/null 2>&1 &
            echo  " ${echo_tips}Please Check file: ${wildfly_rootDir}Dev-wildfly-${wildfly[$i]}/standalone/log/server.log "
            sleep_2
        fi
     #  記錄啓動模塊數
    checkBoolean=`expr ${checkBoolean} + 1`
fi
done
}

#  執行run_wildfly方法
run_wildfly

#  傳入了參數,可是沒有找到應的模塊進行啓動,調help_tips
if [ ${checkBoolean} -eq 0  ];then
    help_tips
fi

說明:

1.wildfly.list需要與run_wildfly.sh放在同一目錄,腳本沒有采用相對路徑,故run_wildfly.sh腳本中須要調整對應的目錄參數shellDIR

2.命令使用,如啓動app容器: ./run_wildfly.sh app

3.啓動全部app容器:./run_wildfly.sh a

 

4.檢查Wildfly是否運行腳本(check_wildfly.sh)

腳本邏輯與啓動腳本一致,直接替換掉run_wildfly方法便可,但記得調用修改後的方法

check_wildfly(){

echo "Time : ${cDate} ${cTime}"
# 循環wildfly.list文件中的全部模塊,根據傳入參數,判斷執行相應的啓動
for ((i=1; i<=${count_n}; i++));
do 
# 根據腳本傳入的參數,啓動對應的容器,傳爲a則啓動全部容器。
if [ "${para_cmd}" == "a" -o "${para_cmd}" == "${wildfly[$i]}" -o "${para_cmd}" == "${wildfly_quick[$i]}" ];then
    echo "Check: ${wildfly[$i]}"
    #檢查 普通用戶 對應容器的進程
    formal_pc=`ps -ef|grep "Formal-wildfly-${wildfly[$i]}/"|grep -v grep|wc -l`
        #容器進程數,若是不爲0,則說明已啓動。反之則進行容器啓動
        if [ $formal_pc -eq 0  ] ; then
            echo "${echo_tips}${echo_tips}UAT not Found!"
        else
            echo "${echo_tips}UAT is running!"
        fi
        
    #檢查 開發者用戶 對應容器的進程
    dev_pc=`ps -ef|grep "Dev-wildfly-${wildfly[$i]}/"|grep -v grep|wc -l`    
        if [ $dev_pc -eq 0 ] ; then
            echo "${echo_tips}${echo_tips}UAT-DEV not Found!"
        else
            echo "${echo_tips}UAT-DEV is running!"
        fi
    # 記錄啓動模塊數
    checkBoolean=`expr ${checkBoolean} + 1`
fi
done
} 

說明:

1.檢查全部app容器運行狀態:./check_wildfly.sh a 


5.中止Wildfly腳本(stop_wildfly.sh)

腳本邏輯與啓動腳本一致,直接替換掉run_wildfly方法便可,但記得調用修改後的方法

stop_wildfly(){
for ((i=1; i<=${count_n}; i++));
do 
if [  " ${para_cmd} " ==  " a " -o  " ${para_cmd} " ==  " ${wildfly[$i]} " -o  " ${para_cmd} " ==  " ${wildfly_quick[$i]} " ];then
    echo  " Stop: ${wildfly[$i]} "
     #  檢查 普通用戶 對應容器的進程,獲得進程號
    formal_pc=`ps -ef|grep  " Formal-wildfly-${wildfly[$i]}/ "|grep -v grep|awk  ' {print $2} '`
         if [  " $formal_pc " ==  "" ] ; then
            echo  " ${echo_tips}${echo_tips}UAT not Found! " 
         else
             #  中止進程
            kill -9 $formal_pc
            sleep_2
             #  再次檢測是否已中止進程
            formal_pc1=`ps -ef|grep  " Formal-wildfly-${wildfly[$i]}/ "|grep -v grep|awk  ' {print $2} '`
             if [  " $formal_pc1 " ==  "" ] ; then
                echo  " ${echo_tips}Stop UAT Success! " 
             else
                echo  " ${echo_tips}${echo_tips}Stop UAT Failure! "
            fi
        fi
     #  檢查 開發者用戶 對應容器的進程,獲得進程號
    dev_pc=`ps -ef|grep  " Dev-wildfly-${wildfly[$i]}/ "|grep -v grep|awk  ' {print $2} '`
         if [  " $dev_pc " ==  "" ] ; then
            echo  " ${echo_tips}${echo_tips}UAT-DEV not Found! " 
         else
             #  中止進程
            kill -9 $dev_pc
            sleep_2
             #  再次檢測是否已中止進程
            dev_pc1=`ps -ef|grep  " Dev-wildfly-${wildfly[$i]}/ "|grep -v grep|awk  ' {print $2} '`
             if [  " $dev_pc1 " ==  "" ] ; then
                echo  " ${echo_tips}Stop UAT-DEV Success! " 
             else
                echo  " ${echo_tips}${echo_tips}Stop UAT-DEV Failure! "
            fi
        fi
    checkBoolean=`expr ${checkBoolean} + 1`
fi
done
}

說明:

1.中止全部容器:./stop_wildfly.sh a


至此,第1個問題已圓滿解決!

 

 

 

結束語:

1.本來考慮與實現相對簡單,初版,把全部的容器路徑寫到文件裏,讀取啓動與中止便可,但不利於自動化部署、WAR分發等問題處理。

2.這個版本是實際當中優化的第三個版本,相對擴展與維護簡單,爲自動化部署提供中止與啓動腳本,也最適合咱們目前的轉測流程。

3.本想與自動部署一塊兒寫此文,發現所講的內容與貼出的腳本內容過多,有時間再講講解決第3、四個問題,超簡單的實現方式shell腳本。

4.Jenkins大多數以爲持續集成用這個很叼,完了其引入除了用發郵件功能、定時任務,其餘組件基本用不上。不少人也許只是對Jenkins組件的熟悉,但徹底不具有Jenkins轉化提高效率的能力,維護成本與效率還不如以前手工操做。

5.思想的支撐尤其重要,能夠在有限的資源裏發揮出最大的功效,尋找到最優的方案。

 

切勿捨本求末,忘記初心!

 

 

 如轉載還請保留出處與做者姓名Findyou,謝謝!

相關文章
相關標籤/搜索