可能最完善的自動化運維腳本(打包、復制、上傳、備份、啟動、刪除)+案例測試


最完善的自動化運維腳本(打包、復制、上傳、備份、啟動、刪除)

1、需求背景:為了快速部署測試,故有如下腳本

2、windows下maven 打包(單個、多個)和copy腳本:

現有開發工具都提供了很方便的打包快捷鍵,但是如果是項目模塊較多,一個個打包麻煩,這時候我們就需要一個自動打包的腳本

打包腳本如下:

參數說明:
D:\codejiedian\workcodejiedian201105\Cloud-Power-Gateway  項目路徑
D:\MAVEN\apache-maven-3.6.1\conf\riest-study-settings.xml maven 配置文件位置
clean install package -Dmaven.test.skip=true 調用maven的 clean install package 跳過測試
	
腳本如下:
@echo OFF

:START

:TUNNEL
cd /d D:\codejiedian\workcodejiedian201105\Cloud-Power-Gateway
mvn --settings D:\MAVEN\apache-maven-3.6.1\conf\riest-study-settings.xml clean install package -Dmaven.test.skip=true
PAUSE
goto TUNNEL

如果有很多個模塊怎么處理?

  • 寫多個上述的打包腳本,每一個是一個單獨的腳本

  • 然后寫一個總的bat腳本來啟動多個打包腳本

    參數說明:
    D:\packagebatWirhIdea\workcodejiedian201105\power\maven-Cloud-Power-WebBase.bat 單個打包腳本未知
    ...... 表示可以寫多個
    
    
    @echo OFF
    
    call D:\packagebatWirhIdea\workcodejiedian201105\power\maven-Cloud-Power-WebBase.bat
    call D:\packagebatWirhIdea\workcodejiedian201105\power\maven-Cloud-Power-Gateway.bat
    ......
    
  • 將所有打包好的包復制到一個指定的文件夾(就是一個copy腳本)

    參數說明:
    D:\mavenjar\com\riest\power\Cloud-Power-Activiti\1.0.0\Cloud-Power-Activiti-1.0.0.jar jar包位置
    E:\JarManager\fushuntest\201217-01 目的地
    ...... 表示可以寫多個
    
    @echo off
    
    copy D:\mavenjar\com\riest\power\Cloud-Power-Activiti\1.0.0\Cloud-Power-Activiti-1.0.0.jar E:\JarManager\fushuntest\201217-01
    copy D:\mavenjar\com\riest\power\Cloud-Power-Gateway\1.0.0\Cloud-Power-Gateway-1.0.0.jar E:\JarManager\fushuntest\201217-01
    ......
    TIMEOUT /T 5
    

3、將所有j准備好jar上傳至服務器

我們這采用pcsp ,這個很簡單,下載安裝就行,也可用自帶的ssh

打開windows命令行窗口,推薦使用powershell

命令如下:

參數說明
--password:服務器密碼
--path:要上傳的文件路徑 
--ip:服務器ip
--serverpath對應的服務器ip

pscp -r -P 22 -pw password path root@ip:serverpath

4、Liunx 啟動jar腳本

需求:調用該腳本后,如果之前有對應的jar啟動,將器kill,然后啟動新的

腳本如下(我們以同時啟動兩個jar為例子)

#!/bin/sh
# jar 名稱,根據實際情況來
export Jenkins_01=Jenkins-1.0.0-01.jar
export Jenkins_02=Jenkins-1.0.0-02.jar
# 啟動參數,根據實際情況配置
export Jenkins_01_xms=-Xms256m -Xmx256m -Xmn128m -Duser.timezone=GMT+8
export Jenkins_02_xms=-Xms256m -Xmx256m -Xmn128m -Duser.timezone=GMT+8
# 啟動端口
export Jenkins_01_port=9090
export Jenkins_02_port=9091
case "$1" in
start)
        ## 啟動Jenkins9090
        echo "--------Jenkins9090 開始啟動--------------"
        nohup java -jar $Jenkins_01 $Jenkins_01_xms &
        Jenkins_01_pid=`lsof -i:$Jenkins_01_port|grep "LISTEN"|awk '{print $2}'`
        until [ -n "$Jenkins_01_pid" ]
            do
              Jenkins_01_pid=`lsof -i:$Jenkins_01_port|grep "LISTEN"|awk '{print $2}'`  
            done
        echo "Jenkins_01 pid is $Jenkins_01_pid"
        sleep 10
        echo "--------Jenkins9090 啟動成功--------------"

	## 啟動Jenkins9091
        echo "--------Jenkins9091 開始啟動--------------"
        nohup java -jar $Jenkins_02 $Jenkins_02_xms &
        Jenkins_02_pid=`lsof -i:$Jenkins_02_port|grep "LISTEN"|awk '{print $2}'`
        until [ -n "$Jenkins_02_pid" ]
            do
              Jenkins_02_pid=`lsof -i:$Jenkins_02_port|grep "LISTEN"|awk '{print $2}'`  
            done
        echo "Jenkins_02 pid is $Jenkins_02_pid"
        sleep 10
        echo "--------Jenkins9091 啟動成功--------------"


        echo "===startAll success==="
        ;;

 stop)
        P_ID=`ps -ef | grep -w $Jenkins_01 | grep -v "grep" | awk '{print $2}'`
        if [ "$P_ID" == "" ]; then
            echo "===Jenkins-01 process not exists or stop success"
        else
            kill -9 $P_ID
            echo "Jenkins-01 killed success"
        fi

   	P_ID=`ps -ef | grep -w $Jenkins_02 | grep -v "grep" | awk '{print $2}'`
        if [ "$P_ID" == "" ]; then
            echo "===Jenkins-02 process not exists or stop success"
        else
            kill -9 $P_ID
            echo "Jenkins-02 killed success"
        fi
        
 
        echo "===stop success==="
        ;;   
 
restart)
        $0 stop
        sleep 10
        $0 start
        echo "===restart success==="
        ;;   
esac    
exit 0

5、Liunx 下備份腳本

我們在啟動新版本的jar時需要備份之前的jar

備份命令如下

#!/bin/bash

#獲得當前的時間
ctime=$(date  +%Y%m%d%H%M%S)

#創建文件夾 
mkdir -p /usr/local/backup/${ctime}

#將需要備份的數據copy
cp -r /mydata/mongodb/* /usr/local/backup/${ctime}

# 壓縮備份 這里有兩個問題
#1、給壓縮文件起名字的時候不能用前面的ctime,暫不清楚原因
#2、壓縮文件會將/usr/local/backup全部備份,后續解決
tar -zcPvf /usr/local/backup/backup$(date +%Y%m%d%H%M%S).tar.gz /usr/local/backup/${ctime}

#刪除copy文件
rm -rf /usr/local/backup/${ctime}

6、聚合腳本:讓前面所有的腳本達到一鍵啟動

  • 詳見測試

7、本地寫代碼打包上傳備份測試

建2個springboot項目,寫一個controller,發送get請求,返回一個字符串,如下圖

新建打包腳本

Cloud-Jenkins-9001.bat

@echo OFF

:START

:TUNNEL
cd /d D:\SpringCloudSeata\SpringCloudStudy\Jenkins-02
mvn --settings D:\MAVEN\apache-maven-3.6.1\conf\riest-study-settings.xml clean install package -Dmaven.test.skip=true
PAUSE
goto TUNNEL
Cloud-Jenkins-9002.bat

@echo OFF

:START

:TUNNEL
cd /d D:\SpringCloudSeata\SpringCloudStudy\Jenkins
mvn --settings D:\MAVEN\apache-maven-3.6.1\conf\riest-study-settings.xml clean install package -Dmaven.test.skip=true
PAUSE
goto TUNNEL

如圖:

將打包腳本聚合在一起

@echo OFF

call E:\210107TEST\PackageBat\SinglePackage\Cloud-Jenkins-9001.bat
call E:\210107TEST\PackageBat\SinglePackage\Cloud-Jenkins-9002.bat

windows復制腳本

@echo off

del  E:\210107TEST\Testjar\*.*

copy D:\mavenjar\com\riest\Jenkins\1.0.0\Jenkins-1.0.0.jar E:\210107TEST\Testjar
copy D:\mavenjar\com\riest\Jenkins-02\1.0.0\Jenkins-02-1.0.0.jar E:\210107TEST\Testjar

TIMEOUT /T 5

遠程主主機的備份shell(判斷是否需要備份,存在備份即可)

#!/bin/bash


if [ ! -d "/root/download/Testjar/" ];then
echo "文件夾不存在"

else
echo "**文件夾存在,開始備份**"
#獲得當前的時間
ctime=$(date  +%Y%m%d%H%M%S)

#創建文件夾
mkdir -p /root/download/backup/${ctime}

#將需要備份的數據copy
cp -r /root/download/Testjar/* /root/download/backup/${ctime}

# 壓縮備份 這里有兩個問題
#1、給壓縮文件起名字的時候不能用前面的ctime,暫不清楚原因
#2、壓縮文件會將/usr/local/backup全部備份,后續解決
tar -zcPvf /root/download/backup/backup$(date +%Y%m%d%H%M%S).tar.gz /root/download/backup/${ctime}

#刪除copy文件
rm -rf /root/download/backup/${ctime}

fi

上傳jar包到遠程主機

@echo off
pass:服務器密碼
ip:服務器ip
E:\210107TEST\Testjar:文件路徑
/root/download:遠程主機命令

pscp -r -P 22 -pw pass E:\210107TEST\Testjar root@服務器ip:/root/download

啟動上傳的jar(三個命令組成:start、stop、restart)

#!/bin/sh
# jar 路徑以及名稱,根據實際情況來
export Jenkins_01=/root/download/Testjar/Jenkins-1.0.0.jar
export Jenkins_02=/root/download/Testjar/Jenkins-02-1.0.0.jar
# 啟動參數,根據實際情況配置
export Jenkins_01_xms=-Xms256m-Xmx256m-Xmn128m-Duser.timezone=GMT+8
export Jenkins_02_xms=-Xms256m-Xmx256m-Xmn128m-Duser.timezone=GMT+8
# 啟動端口
export Jenkins_01_port=9092
export Jenkins_02_port=9091
case "$1" in
start)
        ## 啟動權限01
        echo "--------Jenkins9092 開始啟動--------------"
        nohup java -jar $Jenkins_01 $Jenkins_01_xms &
        Jenkins_01_pid=`lsof -i:$Jenkins_01_port|grep "LISTEN"|awk '{print $2}'`
        until [ -n "$Jenkins_01_pid" ]
            do
              Jenkins_01_pid=`lsof -i:$Jenkins_01_port|grep "LISTEN"|awk '{print $2}'`  
            done
        echo "Jenkins_01 pid is $Jenkins_01_pid"
        sleep 10
        echo "--------Jenkins9092 啟動成功--------------"

	## 啟動工作流01
        echo "--------Jenkins9091 開始啟動--------------"
        nohup java -jar $Jenkins_02 $Jenkins_02_xms &
        Jenkins_02_pid=`lsof -i:$Jenkins_02_port|grep "LISTEN"|awk '{print $2}'`
        until [ -n "$Jenkins_02_pid" ]
            do
              Jenkins_02_pid=`lsof -i:$Jenkins_02_port|grep "LISTEN"|awk '{print $2}'`  
            done
        echo "Jenkins_02 pid is $Jenkins_02_pid"
        sleep 10
        echo "--------Jenkins9091 啟動成功--------------"


        echo "===startAll success==="
        ;;

 stop)
        P_ID=`ps -ef | grep -w $Jenkins_01 | grep -v "grep" | awk '{print $2}'`
        if [ "$P_ID" == "" ]; then
            echo "===Jenkins-01 process not exists or stop success"
        else
            kill -9 $P_ID
            echo "Jenkins-01 killed success"
        fi

   	P_ID=`ps -ef | grep -w $Jenkins_02 | grep -v "grep" | awk '{print $2}'`
        if [ "$P_ID" == "" ]; then
            echo "===Jenkins-02 process not exists or stop success"
        else
            kill -9 $P_ID
            echo "Jenkins-02 killed success"
        fi
        
 
        echo "===stop success==="
        ;;   
 
restart)
        $0 stop
        sleep 10
        $0 start
        echo "===restart success==="
        ;;   
esac    
exit 0

一鍵啟動腳本(windows)

@echo OFF

chcp 65001

echo "啟動,開始打包"
call E:\210107TEST\PackageBat\PolyPackage\Maven-Cloud-Package.bat

echo "啟動,開始復制"
call E:\210107TEST\CopyBat\CopyJar.bat

echo "啟動,遠程調用linux服務器上的sh備份腳本..."
call E:\210107TEST\BackUpLiunx\backup.bat

echo "啟動,開始上傳"
call E:\210107TEST\UploadLiunx\UploadLiunx.bat

echo "啟動,遠程調用linux服務器上的sh啟動腳本..."
call E:\210107TEST\StratJar\startjar.bat


@cmd.exe
exist

8、遺留問題

首先給所有shell腳本授權

chmod +x xxx.sh

9、bug解決

**-bash: ./xxx.sh: /bin/sh^M: bad interpreter: No such file or directory **

原因:Windows環境下dos格式文件傳輸到unix系統時,會在每行的結尾多一個^M,所以在執行的時候出現了這種現象

解決辦法,執行

sed -i -e 's/\r$//' xxx.sh

failed to run command `java': No such file or directory

解決辦法:

首先排除服務器是否有java 環境,當然這一般不可能

第一步:
vim /etc/profile
將自己java配置的環境變量copy出來,如下

第二步執行:
vim ~/.bashrc
第三步將復制的java環境變量copy出來復制到最后,如下

第三步:
source ~/.bashrc

10、測試(注意:博主用的阿里雲服務器,需要去阿里控制台將端口加入安全組)

**以管理員啟動我們的AkeyStart.bat **

第一次我們的要求是自動打包自動上傳沒有備份自己啟動

服務器目錄

確認刪除

第一次不備份,開始啟動

上傳成功

啟動成功

訪問成功(我改了一下返回)

第二次啟動 我們的要求是自動打包自動上傳自動備份

修改代碼的返回

再次啟動我們的一鍵部署腳本

可以看到訪問成功

也可以看到之前的包已經備份

11、以上腳本還有很多可以完善的地方,也參考了很多博主的文章,感謝以下兩位

12、基本的自動化運維腳本算是搞定了,有復雜的場景就需要搭建自動化運維環境了,請持續關注。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM