• 注册
当前位置:1313e > 默认分类 >正文

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

背景:

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

署任务完美的退回去,即使他们对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 != "" ]
thenkill -9 $pidsleep 3nohup java -jar ITS_$1.jar &
elseecho "端口不存在。。。。。。。。"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 != "" ]
thenexec kill -9 $pidecho "---------------进程已关闭----------------"
elseecho "端口不存在。。。。。。。。"
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 rmdone# 要清理的目录,多个目录用空格分开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 -rfdone

 

 

  

 

  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" ]; thenmkdir -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} ]
thenOLD_IFS="$IFS"IFS=","arr=($DEV_HOST)IFS="$OLD_IFS"for host in ${arr[@]}doecho "-----------当前运维的机器ip是:$host--------------------"echo "Please input y or n "readif [ "$REPLY" == "y" ]thenssh -C tomcat@$host "bash -s" < ../../backup_script.sh $1 $2scp ITS_$1.jar tomcat@$host:/home/tomcat/ITS_service/$2/ITS_$1.jarssh -C tomcat@$host "bash -s" < ../../run_script.sh $1 $2 ${port}elseecho "。。。。。。。。。"fidone
fi
if [ "$2" == ${WWW} ]
thenOLD_IFS="$IFS"IFS=","arr=($WWW_HOST)IFS="$OLD_IFS"for host in ${arr[@]}doecho "-----------当前运维的机器ip是:$host--------------------"echo "Please input y or n "readif [ "$REPLY" == "y" ]thenssh -C tomcat@$host "bash -s" < ../../backup_script.sh $1 $2scp ITS_$1.jar tomcat@$host:/home/tomcat/ITS_service/$2/ITS_$1.jarssh -C tomcat@$host "bash -s" < ../../run_script.sh $1 $2 ${port}elseecho "。。。。。。。。。"fidone
fi
if [ "$2" == ${UAT} ]
thenOLD_IFS="$IFS"IFS=","arr=($UAT_HOST)IFS="$OLD_IFS"for host in ${arr[@]}doecho "-------------------当前运维的机器ip是:$host--------------------"echo "Please input y or n "readif [ "$REPLY" == "y" ]thenssh -C tomcat@$host "bash -s" < ../../backup_script.sh $1 $2scp ITS_$1.jar tomcat@$host:/home/tomcat/ITS_service/$2/ITS_$1.jarssh -C tomcat@$host "bash -s" < ../../run_script.sh $1 $2 ${port}elseecho "。。。。。。。。。"fidone
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} ]
thenOLD_IFS="$IFS"IFS=","arr=($DEV_HOST)IFS="$OLD_IFS"for host in ${arr[@]}doecho "-----------当前运维的机器ip是:$host--------------------"echo "Please input y or n "readif [ "$REPLY" == "y" ]thenssh -C tomcat@$host "bash -s" < ./run_script.sh $1 $2 ${port}elseecho "。。。。。。。。。"fidone
fi
if [ "$2" == ${WWW} ]
thenOLD_IFS="$IFS"IFS=","arr=($WWW_HOST)IFS="$OLD_IFS"for host in ${arr[@]}doecho "-----------当前运维的机器ip是:$host--------------------"echo "Please input y or n "readif [ "$REPLY" == "y" ]thenssh -C tomcat@$host "bash -s" < ./run_script.sh $1 $2 ${port}elseecho "。。。。。。。。。"fidone
fi
if [ "$2" == ${UAT} ]
thenOLD_IFS="$IFS"IFS=","arr=($UAT_HOST)IFS="$OLD_IFS"for host in ${arr[@]}doecho "-----------当前运维的机器ip是:$host--------------------"echo "Please input y or n "readif [ "$REPLY" == "y" ]thenssh -C tomcat@$host "bash -s" < ./run_script.sh $1 $2 ${port}elseecho "。。。。。。。。。"fidone
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" ]
thenOLD_IFS="$IFS"IFS=","arr=($DEV_HOST)IFS="$OLD_IFS"for host in ${arr[@]}doecho "-----------当前运维的机器ip是:$host--------------------"echo "Please input y nor n. "readif [ "$REPLY" == "y" ]thenssh tomcat@$host -C "bash -s" < ./stop_script.sh ${port}elseecho "。。。。。。。。。"fidone
fi
if [ "$2" == "www" ]
thenOLD_IFS="$IFS"IFS=","arr=($WWW_HOST)IFS="$OLD_IFS"for host in ${arr[@]}doecho "-----------当前运维的机器ip是:$host--------------------"echo "Please input y nor n. "readif [ "$REPLY" == "y" ]thenssh tomcat@$host -C "bash -s" < ./stop_script.sh ${port}elseecho "。。。。。。。。。"fidone
fi
if [ "$2" == "uat" ]
thenOLD_IFS="$IFS"IFS=","arr=($UAT_HOST)IFS="$OLD_IFS"for host in ${arr[@]}doecho "-----------当前运维的机器ip是:$host--------------------"echo "Please input y or n "readif [ "$REPLY" == "y" ]thenssh tomcat@$host -C "bash -s" < ./stop_script.sh ${port}elseecho "。。。。。。。。。"fidone
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))doindex=$a_lenfor((i=0;i))doif [ ${arr[i]} == ${arr[count]} ]thenindex=$ibreak;fidoneif [ $index -ge $a_len ]thenecho "-----------当前清理的机器ip是:$host--------------------"ssh -C tomcat@${arr[count]} "bash -s" < ./clear_script.shecho "-----------当前清理任务完成----------------------------"fidone

 

 

  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`dofstr=`echo $module | cut -d \_ -f 2`if [ "$fstr" == ${CONTEXT} ]thencontinue;elif [ "$fstr" == ${CODE} ]thencontinue;elif [ "$fstr" == ${SDK} ]thencontinue;elseecho "开启项目-------$fstr----------"sh run_uninstall.sh $fstr $1fidone

 

 

  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`dofstr=`echo $module | cut -d \_ -f 2`if [ "$fstr" == ${CONTEXT} ]thencontinue;elif [ "$fstr" == ${CODE} ]thencontinue;elif [ "$fstr" == ${SDK} ]thencontinue;elsesh shutdown.sh $fstr $1fidone

 

 

  

 

综上:

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

总结:

  优点:

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

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

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

 缺点:

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

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

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

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

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

 

转载于:https://www.cnblogs.com/maybo/p/6925797.html

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 162202241@qq.com 举报,一经查实,本站将立刻删除。

最新评论

欢迎您发表评论:

请登录之后再进行评论

登录
相关推荐