自动化部署

---恢复内容开始---

背景:

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

署任务完美的退回去,即使他们对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 [email protected]$host "bash -s" < ../../backup_script.sh $1 $2
                        scp ITS_$1.jar [email protected]$host:/home/tomcat/ITS_service/$2/ITS_$1.jar
                        ssh -C [email protected]$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 [email protected]$host "bash -s" < ../../backup_script.sh $1 $2
                              scp ITS_$1.jar [email protected]$host:/home/tomcat/ITS_service/$2/ITS_$1.jar
                              ssh -C [email protected]$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 [email protected]$host "bash -s" < ../../backup_script.sh $1 $2
                              scp ITS_$1.jar [email protected]$host:/home/tomcat/ITS_service/$2/ITS_$1.jar
                              ssh -C [email protected]$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 [email protected]$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 [email protected]$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 [email protected]$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 [email protected]$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 [email protected]$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 [email protected]$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 [email protected]${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

  

综上:

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

总结:

优点:

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

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

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

缺点:

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: #ffffff }
span.s1 { }

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

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

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

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

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

---恢复内容结束---

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: #ffffff }
span.s1 { }

背景:

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

署任务完美的退回去,即使他们对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 [email protected]$host "bash -s" < ../../backup_script.sh $1 $2
                        scp ITS_$1.jar [email protected]$host:/home/tomcat/ITS_service/$2/ITS_$1.jar
                        ssh -C [email protected]$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 [email protected]$host "bash -s" < ../../backup_script.sh $1 $2
                              scp ITS_$1.jar [email protected]$host:/home/tomcat/ITS_service/$2/ITS_$1.jar
                              ssh -C [email protected]$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 [email protected]$host "bash -s" < ../../backup_script.sh $1 $2
                              scp ITS_$1.jar [email protected]$host:/home/tomcat/ITS_service/$2/ITS_$1.jar
                              ssh -C [email protected]$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 [email protected]$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 [email protected]$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 [email protected]$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 [email protected]$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 [email protected]$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 [email protected]$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 [email protected]${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

  

综上:

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

总结:

优点:

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

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

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

缺点:

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: #ffffff }
span.s1 { }

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

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

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

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

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

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: #ffffff }
span.s1 { }

时间: 2024-08-06 07:58:02

自动化部署的相关文章

关于自动化部署之docker容器的折腾小记

docker的英文本意是码头工人,也就是搬运工,这种搬运工搬运的是集装箱(Container),集装箱里面装的可不是商品货物,而是任意类型的App,Docker把App(叫Payload)装在Container内,通过Linux Container技术的包装将App变成一种标准化的.可移植的.自管理的组件,这种组件可以在你的latop上开发.调试.运行,最终非常方便和一致地运行在production环境下. 具体什么是docker,你们自己找资料吧,应该好理解.   可以说是个运维的利器,可以把

搭建Puppet自动化部署环境

最近项目上线,自己在部署过程中发现很多问题,发现没有自动化部署工具简直就是纯体力活儿,费时又费力,干的事就是那几个,就不能"一键完成么"的想法油然而生,答案是肯定的,自动化的工具有很多,之所以安装Puppet,只是因为比起别的软件,这款软件原来有学习过,现在又重新拾起来,要把它用到生产环境中,让运维工作不再是体力活,而是实现,全自动部署,更新,这篇只是聊聊安装和配置Puppet,后续还会写具体在生产环境中如何实现自动化代码更新,软件部署等,敬请期待~ 环境介绍: puppetserve

salt分布式自动化部署平台

集中管理平台上安装salt-master 各个交易所监控机上安装salt-minion和salt-master,各个客户端安装salt-minion; salt-master管理各个监控机,监控机管理各个客户端,这样实现统一自动化部署.

持续集成+自动化部署[代码流水线管理及Jenkins和gitlab集成]

持续集成+自动化部署[代码流水线管理及Jenkins和gitlab集成] 标签(空格分隔): Jenkins 一.代码流水线管理 Pipeline名词顾名思义就是流水线的意思,因为公司可能会有很多项目.如果使用jenkins构建完成后,开发构建项目需要一项一项点击,比较麻烦.所以出现pipeline名词. 代码质量检查完毕之后,我们需要将代码部署到测试环境上去,进行自动化测试 新建部署代码项目 点击新建 这里只需要写一下描述 执行Shell脚本 温馨提示:执行命令主要涉及的是权限问题,我们要搞明

cobbler之自动化部署ubuntu14

概述    本例主要实现通过cobbler,配合seed脚本文件,来自动化安装部署ubunut环境,并安装相应的软件并作相应的基本配置,可以通过此方法来为ceph等大规模集群基础部署. seed文件:Debian ubuntu平台的一种自动化部署配置文件 和kickstart文件功能相同.其实ubuntu也可以使用ks文件,但是只能进行基本的环境配置,不能自定义包的安装和脚本的运行. 实验环境 cobbler-server: 1.1.1.122 centos7.2 ubuntu 客户端:kvm虚

MDT 2013 从入门到精通之自动化部署WinSer 2008 R2

因加班等问题,前一段时间我们只更新了MDT 2013从入门到精通系列的前半部分,趁着阅兵休息的这几天,为大家奉上后续的部分,供大家学习参考,如有不足还请大家多多包涵.正如我们所知道的,MDT其实不止能部署用户端操作系统,还可以部署Server服务器端操作系统,今天为大家带来有关MDT 2013如何部署Windows Server 2008 R2企业版操作系统,实现自动化操作,减轻工程师工作量等: 一.导入系统镜像: 1.在MDT控制台Operating Systems项中添加对应Server 版

MDT 2013 从入门到精通之自动化部署WinSer 2012 R2

Windows Server 2012 R2 是由Microsoft设计开发的新一代的服务器专属操作系统,其核心版本号为 Windows NT 6.3 .提供企业级数据中心与混合云解决方案,直观且易于部署.具有成本效益.以应用程序为重点.以用户体验为中心,深受广大 IDC 运营商青睐.之前有好多朋友说MDT无法部署全新设计后的2012,本文将简单介绍该服务器操作系统的自动化部署过程.同时建议大家在使用MDT的时候多测试,因为实践是检验真理的唯一标准,我们测试的结果是为了我们更好的部署自动化,可能

MySQL主从复制原理及配置详细过程以及主从复制集群自动化部署的实现

Technorati 标签: 那你魔鬼 一.复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的.复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读

利用Powershell在IIS上自动化部署网站

本文主要讲如何通过Powershell在IIS上自动化部署ASP.NET网站,而不涉及Powershell的基本语法,如果没有Powershell基础的同学也可以把本文作为学习Powershell的基石,通过学习本文中的脚本再去查阅具体的语法,可能会达到事半功倍的效果. 一般我们建立网站大致需要以下几个步骤: 1.安装.NET Framework 2.安装了IIS 3.注册.启用ISAPI和CGI限制 4.建立网站 5.设置默认首页.身份验证.设置MIME类型 6.绑定域名或IP地址 7.设置权

Django 1.6 最佳实践: django项目的服务器自动化部署(转)

原文:http://www.weiguda.com/blog/41/ 当我们设置服务器时, 不应该每次都使用ssh登录服务器, 再按照记忆一步一步的配置. 因为这样实在是太容易忘记某些步骤了. 服务器设置应当自动化, 并写成文档. 在django用户中, Ansible, SaltStack, Puppet和Chef是最流行的四款自动化部署工具. 这些工具似乎都需要长时间学习才能使用, 因为这些工具不是为一台服务器设置的, 而是针对多台服务器的. 以下是这些工具的基本功能: 远程通过apt-ge