• 自动化部署懒人系列之基础篇


    背景:

         作为一个运维方面还算可以的小白,很自然部门中关于一些运维,部署,监控的任务就落到我身上。在被小伙伴们无数次的呼唤解决项目部署问题后,我忍无可忍,所以,我的目标是把他们交给我的部

    署任务完美的退回去,即使他们对Linux一无所知。

    解决的问题:

            频繁的部署,重启任务。

         主要项目描述:

              项目总有13个模块,spring boot 项目,启动模块有10个。

    前提:

      主管项目后台模块架构设计,参与大部分开发任务,使平台提供运维支持成为可能。由于项目在 不断扩展期间,所以,部署工作十分繁重,严重浪费了我的时间。

    达到目标:

      1.      通过sh run.sh module env 启动项目

      2.      通过 sh shutdown.sh module env 停掉项目

      3.      通过sh run_all.sh env 启动所有项目

      4.      通过 sh shutdown_all.sh module env 停掉项目

      5.      通过 sh clear.sh 清理服务器上七天以前的日志文件以及备份jar包

    技术支持:

      scp 执行文件上传

      ssh 远程执行本地脚本文件

    项目架构规范(针对运维部分)

      1.      项目提供dev,uat,www环境的文件配置

      2.      spring boot 项目maven管理

      3.       配置文件必须在模块目录下conf中application-env.properties

      4.       启动端口必须配置在配置文件中

      5.      模块打包为 Project_module.jar

      6.      模块名字规范: Project_module

    远程执行脚本

      1.      run_script.sh(远程启动脚本)

        通过端口杀掉进程,通过模块名启动模块。

     

    #! /bin/bash
    echo $1,$2,$3
    cd ~/ITS_service/$2/
    pwd
    pid=`/usr/sbin/lsof -t -i:$3`
    echo $pid
    if [ $pid != "" ]
    then
       kill -9 $pid
       sleep 3
       nohup java -jar ITS_$1.jar &
    else
       echo "端口不存在。。。。。。。。"
       nohup java -jar ITS_$1.jar &
    fi

     

     

     

      2.      shutdown_script.sh(远程停止脚本)

        通过端口杀掉进程。

     

    #!/usr/bin/env bash
    pid=`/usr/sbin/lsof -t -i:$1`
    echo $pid
    if [ $pid != "" ]
    then
       exec kill -9 $pid
       echo "---------------进程已关闭----------------"
    else
       echo "端口不存在。。。。。。。。"
    fi

     

     

      3.      clear_script.sh(远程清理脚本)

        清理任务清理所有。

     

    #!/bin/bash
    
          # 要清理的目录,多个目录用空格分开
          logs=(/home/tomcat/ITS_service/www/logs /home/tomcat/ITS_service/dev/logs /home/tomcat/ITS_service/uat/logs)
    
          # 循环 logs 数组
          for dir in ${logs[*]}
            do
              # 删除目录下 7 天之前的日志文件
              find $dir -mtime +7 -name *.log* | xargs rm
            done
    
          # 要清理的目录,多个目录用空格分开
          jars=(/home/tomcat/ITS_service/www /home/tomcat/ITS_service/dev /home/tomcat/ITS_service/uat)
    
          # 循环 jars 数组
          for dir in ${jars[*]}
            do
              # 删除目录下 7 天之前的备份jar包
              find $dir -mtime +7 -name backup* | xargs rm -rf
            done

     

     

      

     

      4.      backup_script.sh(备份jar包)

        通过 模块环境,模块名字备份jar。

     

    #! /bin/bash
    echo $1,$2
    cd ~/ITS_service/$2/
    pwd
    t=`date "+%Y-%m-%d-%H"`
    Ddate=`date "+%Y-%m-%d"`
    folder=~/ITS_service/$2/backup_$Ddate/
    echo "备份ITS_$1.jar.............."
    if [ ! -d "$folder" ]; then
      mkdir -p "$folder"
    fi
    cp ITS_$1.jar $folder/ITS_$1_backup_$t.jar
     

     

      

     

    本地执行脚本

      1.      run.sh

      通过模块名字环境名字打包,获取端口,通过调用(backup_script.sh)备份jar包,通过上传命令上传jar,通过调用启动远程脚本(run_script.sh)启动。

     

    #!/usr/bin/env bash
    #cd ./ITS_core
    #mvn clean && mvn install -Dmaven.test.skip=true
    #cd ..
    #cd ./ITS_sdk
    #mvn clean && mvn install -Dmaven.test.skip=true
    #cd ..
    #cd ./ITS_context
    #mvn clean && mvn install -Dmaven.test.skip=true
    #cd ..
    cd ./ITS_$1
    port=`cat ./src/main/resources/config/application-$2.properties | grep server.port | awk -F '=' '{print $2}'`
    echo "port:${port}"
    mvn clean
    mvn package -P$2 -Dmaven.test.skip=true
    cd target
    DEV=dev
    WWW=www
    UAT=uat
    DEV_HOST=`cat ../../host.properties | grep dev.host | awk -F '=' '{print $2}'`
    UAT_HOST=`cat ../../host.properties | grep uat.host | awk -F '=' '{print $2}'`
    WWW_HOST=`cat ../../host.properties | grep www.host | awk -F '=' '{print $2}'`
        echo "----------------开始执行$2环境$1项目的部署-------------------------"
    if [ "$2" == ${DEV} ]
    then
         OLD_IFS="$IFS"
                         IFS=","
                         arr=($DEV_HOST)
                         IFS="$OLD_IFS"
                         for host in ${arr[@]}
                         do
                          echo "-----------当前运维的机器ip是:$host--------------------"
                          echo "Please input y or n "
                          read
                          if [ "$REPLY" == "y" ]
                          then
                            ssh -C tomcat@$host "bash -s" < ../../backup_script.sh $1 $2
                            scp ITS_$1.jar tomcat@$host:/home/tomcat/ITS_service/$2/ITS_$1.jar
                            ssh -C tomcat@$host "bash -s" < ../../run_script.sh $1 $2 ${port}
                          else
                             echo "。。。。。。。。。"
                          fi
                         done
    fi
    if [ "$2" == ${WWW} ]
    then
          OLD_IFS="$IFS"
                               IFS=","
                               arr=($WWW_HOST)
                               IFS="$OLD_IFS"
                               for host in ${arr[@]}
                               do
                                echo "-----------当前运维的机器ip是:$host--------------------"
                                echo "Please input y or n "
                                read
                                if [ "$REPLY" == "y" ]
                                then
                                  ssh -C tomcat@$host "bash -s" < ../../backup_script.sh $1 $2
                                  scp ITS_$1.jar tomcat@$host:/home/tomcat/ITS_service/$2/ITS_$1.jar
                                  ssh -C tomcat@$host "bash -s" < ../../run_script.sh $1 $2 ${port}
                                else
                                   echo "。。。。。。。。。"
                                fi
                               done
    fi
    if [ "$2" == ${UAT} ]
    then
          OLD_IFS="$IFS"
                               IFS=","
                               arr=($UAT_HOST)
                               IFS="$OLD_IFS"
                               for host in ${arr[@]}
                               do
                                echo "-------------------当前运维的机器ip是:$host--------------------"
                                echo "Please input y or n "
                                read
                                if [ "$REPLY" == "y" ]
                                then
                                  ssh -C tomcat@$host "bash -s" < ../../backup_script.sh $1 $2
                                  scp ITS_$1.jar tomcat@$host:/home/tomcat/ITS_service/$2/ITS_$1.jar
                                  ssh -C tomcat@$host "bash -s" < ../../run_script.sh $1 $2 ${port}
                                else
                                   echo "。。。。。。。。。"
                                fi
                               done
    fi
     
    
      

     

     

      2.      run_uninstall.sh

      和上面不通是只进行启动不上传。

     

    #!/usr/bin/env bash
    cd ./ITS_$1
    port=`cat ./src/main/resources/config/application-$2.properties | grep server.port | awk -F '=' '{print $2}'`
    echo "port:${port}"
    DEV=dev
    WWW=www
    UAT=uat
    echo "-------------------------开始执行$2环境$1项目的部署-------------------------"
    cd ..
    DEV_HOST=`cat ./host.properties | grep dev.host | awk -F '=' '{print $2}'`
    UAT_HOST=`cat ./host.properties | grep uat.host | awk -F '=' '{print $2}'`
    WWW_HOST=`cat ./host.properties | grep www.host | awk -F '=' '{print $2}'`
    if [ "$2" == ${DEV} ]
    then
        OLD_IFS="$IFS"
                    IFS=","
                    arr=($DEV_HOST)
                    IFS="$OLD_IFS"
                    for host in ${arr[@]}
                    do
                     echo "-----------当前运维的机器ip是:$host--------------------"
                     echo "Please input y or n "
                     read
                     if [ "$REPLY" == "y" ]
                     then
                       ssh -C tomcat@$host "bash -s" < ./run_script.sh $1 $2 ${port}
                     else
                        echo "。。。。。。。。。"
                     fi
                    done
    fi
    if [ "$2" == ${WWW} ]
    then
        OLD_IFS="$IFS"
                        IFS=","
                        arr=($WWW_HOST)
                        IFS="$OLD_IFS"
                        for host in ${arr[@]}
                        do
                         echo "-----------当前运维的机器ip是:$host--------------------"
                         echo "Please input y or n "
                         read
                         if [ "$REPLY" == "y" ]
                         then
                           ssh -C tomcat@$host "bash -s" < ./run_script.sh $1 $2 ${port}
                         else
                            echo "。。。。。。。。。"
                         fi
                        done
    fi
    if [ "$2" == ${UAT} ]
    then
        OLD_IFS="$IFS"
                        IFS=","
                        arr=($UAT_HOST)
                        IFS="$OLD_IFS"
                        for host in ${arr[@]}
                        do
                         echo "-----------当前运维的机器ip是:$host--------------------"
                         echo "Please input y or n "
                         read
                         if [ "$REPLY" == "y" ]
                         then
                           ssh -C tomcat@$host "bash -s" < ./run_script.sh $1 $2 ${port}
                         else
                            echo "。。。。。。。。。"
                         fi
                        done
    fi
     
    
      
    
     

     

      3.      shutwon.sh

      通过模块名字环境名字打包,获取端口,通过调用停止远程脚本(shutdown_script.sh)结束任务。

     

    #!/usr/bin/env bash
    cd ./ITS_$1
    port=`cat ./src/main/resources/config/application-$2.properties | grep server.port | awk -F '=' '{print $2}'`
    echo "-----------------当前项目端口号:${port}-----------------------"
     echo "----------------开始执行$2环境$1项目下线-------------------------"
    cd ..
    DEV_HOST=`cat ./host.properties | grep dev.host | awk -F '=' '{print $2}'`
    UAT_HOST=`cat ./host.properties | grep uat.host | awk -F '=' '{print $2}'`
    WWW_HOST=`cat ./host.properties | grep www.host | awk -F '=' '{print $2}'`
    if [ "$2"=="dev" ]
    then
        OLD_IFS="$IFS"
        IFS=","
        arr=($DEV_HOST)
        IFS="$OLD_IFS"
        for host in ${arr[@]}
        do
         echo "-----------当前运维的机器ip是:$host--------------------"
         echo "Please input y nor n. "
         read
         if [ "$REPLY" == "y" ]
         then
            ssh tomcat@$host -C "bash -s" < ./stop_script.sh ${port}
         else
            echo "。。。。。。。。。"
         fi
        done
    fi
    if [ "$2" == "www" ]
    then
        OLD_IFS="$IFS"
            IFS=","
            arr=($WWW_HOST)
            IFS="$OLD_IFS"
            for host in ${arr[@]}
            do
             echo "-----------当前运维的机器ip是:$host--------------------"
             echo "Please input y nor n. "
             read
             if [ "$REPLY" == "y" ]
             then
                ssh tomcat@$host -C "bash -s" < ./stop_script.sh ${port}
             else
                echo "。。。。。。。。。"
             fi
            done
    fi
    if [ "$2" == "uat" ]
    then
        OLD_IFS="$IFS"
                IFS=","
                arr=($UAT_HOST)
                IFS="$OLD_IFS"
                for host in ${arr[@]}
                do
                 echo "-----------当前运维的机器ip是:$host--------------------"
                 echo "Please input y or n "
                 read
                 if [ "$REPLY" == "y" ]
                 then
                    ssh tomcat@$host -C "bash -s" < ./stop_script.sh ${port}
                 else
                    echo "。。。。。。。。。"
                 fi
                done
    fi
     
    
      
    
     

     

      4.       clear.sh

      通过服务器列表调用清理脚本(clear_script.sh)清理任务 

     

    #!/bin/bash
    DEV_HOST=`cat ./host.properties | grep dev.host | awk -F '=' '{print $2}'`
    UAT_HOST=`cat ./host.properties | grep uat.host | awk -F '=' '{print $2}'`
    WWW_HOST=`cat ./host.properties | grep www.host | awk -F '=' '{print $2}'`
    HOST="$DEV_HOST,$UAT_HOST,$WWW_HOST"
         OLD_IFS="$IFS"
                         IFS=","
                         arr=($HOST)
                         IFS="$OLD_IFS"
                         a_len=${#arr[@]}
                        for((count=0;count<a_len;count++))
                         do
                           index=$a_len
                           for((i=0;i<count;i++))
                           do
                             if [ ${arr[i]} == ${arr[count]} ]
                             then
                               index=$i
                               break;
                             fi
                           done
                           if [ $index -ge $a_len ]
                           then
                             echo "-----------当前清理的机器ip是:$host--------------------"
    
                             ssh -C tomcat@${arr[count]} "bash -s" < ./clear_script.sh
    
                             echo "-----------当前清理任务完成----------------------------"
                           fi
                         done
     
    
      

     

     

      5.      run_all.sh

      通过host配置文件获取对应环境的host机器并调用run_uninstall.sh批量启动。

     

    #! /bin/bash
    CONTEXT=context
    CODE=core
    SDK=sdk
    for module in `sed -n 's/.*>(.*)</module>/1/p' $1 pom.xml`
       do
        fstr=`echo $module | cut -d \_ -f 2`
        if [ "$fstr" == ${CONTEXT} ]
        then
          continue;
        elif [ "$fstr" == ${CODE} ]
        then
          continue;
    
        elif [ "$fstr" == ${SDK} ]
        then
          continue;
       else
         echo "开启项目-------$fstr----------"
         sh run_uninstall.sh $fstr $1
       fi
       done
     
    
      

     

     

      6.      shutdown_all.sh

      通过host配置文件获取对应环境的host机器并调用shutdown.sh批量结束。

     

    #! /bin/bash
    CONTEXT=context
    CODE=core
    SDK=sdk
    for module in `sed -n 's/.*>(.*)</module>/1/p' $1 pom.xml`
       do
        fstr=`echo $module | cut -d \_ -f 2`
        if [ "$fstr" == ${CONTEXT} ]
        then
          continue;
        elif [ "$fstr" == ${CODE} ]
        then
          continue;
    
        elif [ "$fstr" == ${SDK} ]
        then
          continue;
       else
         sh shutdown.sh $fstr $1
       fi
       done

     

     

      

     

    综上:

      以上所有脚本文件需要放在项目根目录下执行。

    总结:

      优点:

    可以通过简单的命令就可以启动,停止项目,使用方便。

    不再需要登录到服务器上部署。

    通过简单的说明,就可以使小伙伴们在自己机器实现部署。

     缺点:

    如果服务器实现环境隔离就无法通过ssh部署。

    没有权限控制,很容易搞乱环境。开放性太高。

    在杀掉进程时候有时候发现一个端口对应多个进程,情况无法停止。

    启动时候可能只需要获取启动时候成功,不需要输出日志文件。

    下篇将结合gitlab如何实现自动化部署,解决环境隔离问题

     

  • 相关阅读:
    C和指针学习笔记--第五章
    C和指针学习笔记--第四章
    C和指针学习笔记--第三章
    ipables常用命令
    linux网络设计与实现-----第一章
    iptables
    cJSON学习
    Makefile-更新函数库文件
    Makefile隐晦规则
    【Spark学习笔记】01-Spark简介
  • 原文地址:https://www.cnblogs.com/maybo/p/6925797.html
Copyright © 2020-2023  润新知