远程部署tomcat脚本

脚本实现功能,从本地上传war包到指定服务器的指定目录,停止对应tomcat进程,替换上个版本的war包并进行备份(以防线上问题出现意外可以进行回滚)。

第一个脚本主要是上传war包到指定服务器的指定目录,shell脚本参考如下,在本地或者发布机器上运行:

#/bin/bash

set -e
cur_date=`date +‘%Y%m%d %H:%M:%S‘`
current_day=`date +"%Y%m%d"`
read -p "1.部署生产环境 2.测试环境
" nu
echo $nu
if [ ${nu} -eq 1 ]
then
    read -p "请选择部署服务器ip:
    1. nginx-server
    2. app-server
    3. app-pay
    4. pay-server
    5. redis1
    6. redis2
    " nu1
    case ${nu1} in
        1)
            ip_addr=IP1
            ;;
        2)
            ip_addr=IP2
            ;;
        3)
            ip_addr=IP3
            ;;
        4)
            ip_addr=IP4
            ;;
        5)
            ip_addr=IP5
            ;;
        6)
            ip_addr=IP6
            ;;
        *)
            echo -e "请输入1~4的数字\n"
            exit 1
            ;;
    esac
elif [ ${nu} -eq 2 ]
then
    read -p "请选择部署服务器ip
    1. IP7
    2. IP8
    " nu2
    case ${nu2} in
        1)
            ip_addr=IP7
            ;;
        2)
            ip_addr=IP8
            ;;
        *)
            echo -e "请输入1~2的数字\n"
            exit 1
            ;;
    esac
else
    echo -e "请选择正确的部署环境\n"
    exit 1
fi
read -p "请输入部署服务器上传目录:" dir
read -p "请输入部署war包名称:" war_name
S_PATH=`pwd`
echo "********** "$cur_date" *******"
sleep 1
echo "******** 开始上传war包 *******"
ssh [email protected]${ip_addr} "mkdir -p /${dir}/${current_day}"
read -p "是否已经上传过war包:1,是  2,否
" nu3
if [ $nu3 -eq 2 ]
then
    scp ./${war_name}.war [email protected]${ip_addr}:/${dir}/${current_day}
else
    echo -e "跳过上传,继续进行部署"
fi
scp ./deploy_finance.sh [email protected]${ip_addr}:/${dir}/${current_day}
echo -e "********开始进行部署***********"
ssh -t [email protected]${ip_addr} "sh ${dir}/${current_day}/deploy.sh $dir $war_name"

第二个脚本即上个脚本中提到的deploy.sh脚本,主要用来停止对应tomcat进程,替换上个版本的war包并进行备份,运行在tomcat应用服务器上

#/bin/bash
set -e

#*******设置系统临时环境变量********
read -p "是否需要设置环境变量,请根据部署环境选择
1.生产环境不需要
2.测试环境需要
" nu
if [ ${nu} -eq 2 ]
then
    echo -e "*****设置系统临时环境变量******"
    export JAVA_HOME=/usr/local/java/jdk1.7.0_79
        export PATH=$PATH:$JAVA_HOME
else
    echo -e "跳过变量设置,继续部署"
fi
#*******部署服务*******
#*********************

#*******停止服务********

function deploy_war
{
    file_war=$1
    echo -e "*****INFO: 停止服务*******"
    _PID=`ps -ef|grep -w "${deploy_dir}"|grep -v grep|awk ‘{print $2}‘`
    if [ 8${_PID} -eq 8 ]
    then
        echo -e "进程不在运行,直接部署\n"
    else
        echo -e "${_PID}"
        cd ${deploy_dir}
        kill -9 ${_PID}
        sleep 3
        _PID=`ps -ef|grep -w "${deploy_dir}"|grep -v grep|awk ‘{print $2}‘`
        if [ 8${_PID} -ne 8 ];then
            echo -e "*********${file_war}进程停止失败,请检查日志,部署脚本退出********"
            exit 1
        else
            echo -e "********${file_war}进程已停止*********"
        fi
    fi
    #*********删除文件目录,备份war包*********
    if [ -d "${deploy_dir}/webapps" ]; then
        cd ${deploy_dir}/webapps
        echo -e "*********INFO: 切换目录成功"
        rm -rf ./${file_war}
        if [ $? -ne 0 ];then
            echo -e "*********${file_war}目录删除失败,退出部署************"
            exit 1
        else
            echo -e "**********${file_war}目录删除成功,继续部署***********"
        fi
        tar -zcvf ${file_war}${current_day}.war.tar.gz ${file_war}.war
        if [ $? -ne 0 ];then
            echo -e "************备份失败,退出部署************"
            exit 1
        else
            echo -e "***********备份成功,继续部署*************"
        fi
        cp -a /$dir/${current_day}/${file_war}.war /${deploy_dir}/webapps
        if [ $? -eq 0 ];then
            echo -e "******************war包拷贝成功***********"
        else
            echo -e "******************war包拷贝失败,退出部署***************"
            exit 1
        fi
    else
        echo -e "************webapps目录不存在,请创建tomcat目录,退出部署******\n"
        exit 1
    fi

#********** 重启应用 ***********
    echo -e "*********INFO:启动服务***********\n"
    cd ${deploy_dir}
    rm -rf work
    rm -rf temp/*
    cd ${deploy_dir}/bin
    setsid ./startup.sh
    _PID1=`ps -ef|grep -w "${deploy_dir}"|grep -v grep|awk ‘{print $2}‘`
    sleep 8
    if [ 8$[_PID1] -eq 8 ];then
        echo -e "************** ERROR:${file_war}启动失败,请检查启动日志***********\n"
        exit 1
    else
          echo "**********${file_war}启动完毕"
    fi
}

dir=$1
war_name=$2
current_day=`date +"%Y%m%d"`
if [ -d "${dir}/${current_day}" ]; then
    echo -e "**********INFO: ${current_day}目录已经存在,请忽略。\n"
else
    mkdir -p ${dir}/${current_day}
fi

if [ $# -ne 2 ];then
    echo -e "******执行部署脚本时需要传入安装包存放目录********\n"
    echo -e "******即将退出部署\n"
    echo -e "******脚本执行方式,例如: ./deploy_finance.sh /mnt app
    "
    exit 1
fi
read -p "*********请选择部署目录:
1. dir1
2. dir2
3. dir3
4. dir4
5. dir5
6. dir6
7. dir7
8. dir8
" nu_dir
case ${nu_dir} in
    1)
        deploy_dir=dir1
        ;;
    2)
        deploy_dir=dir2
        ;;
    3)
        deploy_dir=dir3
        ;;
    4)
        deploy_dir=dir4
        ;;
    5)
        deploy_dir=dir5
        ;;
    6)
        deploy_dir=dir6
        ;;
    7)
        deploy_dir=dir7
        ;;
    8)
        deploy_dir=dir8
        ;;
    *)
        echo -e "请选择正确的部署目录,即将退出部署/n"
        exit 1
esac
deploy_war ${war_name}

这里记录踩下的两个坑:

1.最初脚本写完之后是在测试环境下运行的,测试环境的JAVA目录并没有做软连接到/usr/bin下,只要运行部署脚本,tomcat都会因为找不到java_home的路径而报错,但是ssh到服务器上是能够正常启动的,看了一下/etc/profile文件的内容,之前的兄弟是把java环境变量放在这个文件做导入的,那么为什么ssh到服务器上去到tomcat/bin目录下执行./startup.sh能正常启动呢,./startup.sh是继承当前shell环境变量的,当你ssh 到服务器的时候,属于login shell,会去读取/etc/profile中的文件内容,自然会加载java的环境变量,而在远程脚本中执行./startup.sh,此时启动的shell子进程会继承父进程deploy.sh的环境变量,而这对父子进程都是属于no login shell,不会去读取/etc/profile的内容,但是它会去读取~/.bashrc中的内容,后来我去这个文件中设置java环境变量之后确实启动正常了。

2.第二个坑是最初在deploy.sh脚本中启动tomcat的时候,直接用的是./startup.sh,导致的结果就是每次发布的时候,本地从服务器上分配的伪终端显示tomcat进程启动成功,但是登录服务器进行检查的时候发现对应的tomcat根本没有启动成功。后来想了半天,原来是因为这种方式启动的tomcat进程是属于对应的sshd的子进程,当脚本运行完毕之后,对应的sshd进程结束之后,服务器收到singalhup,也会把其进程树下的子进程停掉。解决的方式就是用nohup或者setsid去启动tomcat,相应的命令解释有需求的同学可以谷歌一哈。

后续展望:

1.看能否用jenkins缩短发布时间,但是因为用的是阿里金融云且svn服务器是在公司本地的一台物理机上,且金融云环境和公司网络无法进行通讯(安全第一),用jenkins做持续集成和发布难以做到

2.总觉得shell语法不人性化,后面加强一下python学习,看能否用python完全代替掉shell

3.不知道大家有没有相关工具推荐一下,主要解决的痛点是要去特定的服务器上替换特定的文件

*******************************************

做为一个运维新手且木有人带,真是压力山大,记得之前有个前辈说过写出来的东西才是自己的,特此感谢博客园批准俺开通了微博来记录自己的学习经历和成长过程,上述文章如果有错误的地方或者童鞋们有更好的想法欢迎大家指出,也可以加我微信大家一起交流

时间: 2024-07-31 11:09:56

远程部署tomcat脚本的相关文章

使用IDEA远程部署tomcat和调试

环境: CentOS 7 Tomcat 9.0.1 jdk-9.0.1 IntelliJ IDEA 2017.3 Tomcat中的配置 在catalina.sh文件中加入以下的配置 CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.

自动部署tomcat 脚本

. /etc/init.d/functions #调用系统函数 yum -y install java >/dev/null TAR="apache-tomcat-9.0.0.M26" URL="http://mirror.bit.edu.cn/apache/tomcat/tomcat-9/v9.0.0.M26/bin/${TAR}.tar.gz" DST="/usr/local/tomcat_test" cd /usr/local/src

linux下实现自动部署tomcat的脚本

linux下实现自动部署tomcat的脚本 由于经常部署war到tomccat上,经常有一些重复的工作要做:停服务.备份war包.上传新的war包.启动服务.索性就写了一个自动部署的脚本. 脚本如下autoDeploy.sh: 1 #! /bin/sh 2 echo '####################开始自动部署####################' 3 path=`pwd` #当前路径 4 tomcatPath=tomcat-7 #指定tomcat文件目录名称 5 cd ../$t

tomcat远程部署应用

Tomcat安装成功后,在ip地址:8080上就可以看见熟悉的首页,在这个首页中,上方有一个manage app按钮,点击就可以进行应用管理了.这样就不需要使用ftp把war包传上去了. 要想远程部署,需要更改两个地方,第一个地方比较容易发现,只要点击按钮,就会跳到一页,这页内容知道我们更改TOMCAT_HOME/conf/tomcat-users.xml目录,照着来就可以了. 仍旧发现无法访问manage app,这是因为tomcat 8.5以后的版本,默认manage app这个应用不许远程

使用Jenkins远程部署war包到tomcat container

Jenkins首先使用maven将源代码进行编译打包,之后需要将war包传送到tomcat服务器上进行部署. 来看一下Jenkins的基本配置,首先需要安装插件"Deploy to container Plugin": 但是在安装插件时,Jenkins会先ping www.google.com这个域名来保证网络连通性 ,我们需要将其改为www.baidu.com,来使得检查阶段通过: 编辑Jenkins的配置文件default.json: 将connnectionCheckUrl改为h

Linux 安装tomcat及tomcat自带远程部署项目与管理

准备: 1.Linux系统 2.已经安装好jdk 开始: 选择要安装的tomcat版本:https://archive.apache.org/dist/tomcat/ 我这里使用的是tomcat 8.5.15 1.wget -b下载tar.gz,2.tar zxvf 解压当前目录,3.mv 重命名,也可以移动 -bash-4.2# cd /opt/ -bash-4.2# wget -b https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.15

centos记录uptime,tomcat日志切割,远程拷贝日志脚本

1.uptime日志脚本(每天记录) #!/bin/sh dir=/tmp/uptime_log process=`ps -ef|grep $0|grep -v "grep" |grep -v "vim"|grep -v "ps"|wc -l` if [ $process -gt 2 ];then echo $process exit; fi if [ ! -d $dir ];then mkdir -p $dir; fi while true d

jenkins自动部署tomcat

关于部署的3种思路: 远程部署(jenkins编译部署到远程服务器): 安装ssh插件 ssh插件配置 添加远程jenkins服务器节点: 本地部署(与jenkins在同一服务器): 关于maven构建的两种选择: 直接选择maven插件 自带插件(): 插件配置(或直接新建maven项目):   添加shell编译过程,通过shell调用服务器的maven环境 jenkins配置: export BUILD_ID=XXXXXX # 必须得加,原因未知,否则无法启动tomcat export p

IDEA远程调试Tomcat

IDEA远程调试Tomcat 之前基本上都是打log来找BUG的,看看log基本上也就知道什么问题了.但是把有些问题还是调试来的方便,于是开始研究怎么远程调试Tomcat....表示各种教程太杂太乱,基本上不懂原理.弄了半天,终于能够调试了..记录下. 一.tomcat的jpda服务 什么是JPDA呢 JPDA(Java Platform Debugger Architecture) 是 Java 平台调试体系结构的缩写,通过 JPDA 提供的 API,开发人员可以方便灵活的搭建 Java 调试