技术导语: 之前有篇文章已经基本介绍了应用服务开机自启的实现方法,本文着重基于脚本管理方便性、脚本内容通用性、脚本应用环境适配性三大方面的考虑,编写自启脚本,达到一个脚本适用所有应用服务自启的效果。
关于运维工作的最佳实践
在接到这个需求的初期,就在思考如何最小能力成本地编写脚本,包括后续的脚本维护。主要有如下几大难题。
- 应用部署路径不同
- 应用启动指令不同
- 应用部署环境不同
- 应用部署用户不同
针对三个难题的解决方案更多的还是从部署规范上去思考。
应用部署路径不同
前提: 统一部署路径规范,所有应用部署在同一级目录,每个应用预先定义好路径名称。
脚本实现: 可以通过遍历的方式获取到所有应用的部署路径。
应用启动指令不同
前提: 理想情况下可以统一启动指令,特殊情况下允许不同启动命令的存在。
脚本实现: 可以在自启脚本里面通过判断启动脚本是否存在获知启动指令。
应用部署环境不同
前提: 当前主流的环境分类:开发、测试、预生产、生产。不同环境可能导致启动参数不同,其实也可以归类为启动指令不同。
脚本实现: 通过传参的方式鉴别不同环境。
应用部署用户不同
前提: 为了实现应用间隔离,行业内做法一般是不同应用通过不同的用户部署,从安装部署到启停均适用应用用户进行操作。
脚本实现: 可以在自启脚本里面获取部署目录所属用户。
基于解决这三大问题的逻辑,编写脚本如下:
vi reboot_start_all.sh
#!/bin/bash
cd /app/deploy/server #预先规范的统一部署路径,其下每一个文件夹代表一个应用目录
filelist=`ls $dir` #获取应用目录列表
echo $(date +'%Y-%m-%d %H:%M:%S')>> /app/reboot_start_all.log
echo 'start restart app!!!' >> /app/reboot_start_all.log
for file in $filelist #遍历应用目录
do
echo 'dirname:'$file >> /app/reboot_start_all.log
username=`ls -lrt /app/deploy/server/$file |awk '{print $3}'` #获取部署用户
echo 'username:'$username >> /app/reboot_start_all.log
cd /app/deploy/server/$file/bin
if [ -f "startway1.sh" ];then
su - $username <<EOF #切换到应用用户进行应用服务的启停
cd /app/deploy/server/$file
pwd
/usr/bin/sh bin/shutdownway1.sh $1 && /usr/bin/sh bin/startupway1.sh $1 # $1是外部传入的变量,值域范围[test,dev,prod]
exit;
EOF
else
su - $username <<EOF
cd /app/deploy/server/$file
pwd
/usr/bin/sh bin/shutdownway2.sh $1 && /usr/bin/sh bin/startupway2.sh start $1
exit;
EOF
fi
cd /app/deploy/server
done
echo $(date +'%Y-%m-%d %H:%M:%S')>> /app/reboot_start_all.log
echo 'finish restart app!!!' >> /app/reboot_start_all.log
执行方式
测试环境: sh reboot_start_all.sh test
开发环境: sh reboot_start_all.sh dev
生产环境: sh reboot_start_all.sh prod
如果您喜欢我的文章,请关注我哦。后续会提供更多的干货分享。
shell脚本实现应用服务多环境开机自启
本文介绍了一种基于shell脚本的通用方法,用于解决应用服务在不同部署路径、启动指令、环境下的开机自启问题。通过统一部署路径、判断启动脚本、传参鉴别环境及获取部署目录用户,实现一个脚本适用于所有应用服务的自启,降低了运维工作成本。
8159

被折叠的 条评论
为什么被折叠?



