根据《简化部署设计方案V2》的内容,内层部署需要提供的 .sh 脚本应覆盖部署流程的各个阶段,确保组件能够顺利安装、配置、启动、检查状态,并支持升级和卸载。
一、 部署某组件所需的内层结构
左侧是约定的内层结构,右侧的其他部署的内容物,按需存放即可。
1.1 scripts目录:存放执行的脚本
每个组件应该包含一个scripts的目录,用于存放执行的脚本。
下面是脚本的说明
脚本名称 | 功能 |
---|---|
config.sh | 配置脚本 |
install.sh | 安装脚本 |
start.sh | 启动脚本 |
stop.sh | 停止脚本 |
status.sh | 运行状态检查脚本 |
upgrade.sh | 升级脚本 |
1.2 sqls目录:按版本存放sql脚本
每个sql版本的目录中,应具有完整的sql脚本init.sql和当前版本的升级sql脚本update.sql。
例如,当用户直接安装某个版本时,则直接调用其init.sql脚本即可。
当用户从某个版本更新的时候,就可以调用从原版本开始的之后的所有更新update.sql脚本。
1.3 services 目录:存放系统服务类
启动业务尽量采用系统服务的方式启动,这样可以便于运维、自启动等。如果确实不能以服务方式启动的,可以不使用该方法。
二、文件准备结构和功能
2.1 config.sh 配置相关的脚本
1、必要的参数要求
--read
读取所有参数配置:组件依照自己的配置,读取并返回所有的参数配置,以点分的参数方式
。
例如server.port=35000
,按行分隔所有的配置。
例如,当调用 config.sh --read
的时候会读取所有的参数配置。
这个时候,应该返回下面的示例内容
[组件名]
参数1=值1
参数2=值2
以知识库系统为例,需要输出下面的参数例子
[knowledge] #知识库组件
server.port=35000 # 后端的默认端口为35000
nginx.web.port=18080 # 平台前端访问端口
...
参数的长短格式不限,由内层组件自己确定,所有组件输出的时候「均需要带有适当的注释」。
2.2 install.sh - 安装脚本
1、必要的参数要求
--config-file 文件名
解析文件,读取所有自己的参数列表,这个文件名仅支持使用绝对路径的方式传入。
外部传入的配置文件格式为
[组件名]
参数1=
参数2=
这里的参数是内部系统自己需要的参数。以知识库系统为例:
[knowledge] #知识库组件
server.port=35000 # 后端的默认端口为35000
nginx.web.port=18081 # 平台前端访问端口
...
这里与读取出来的保持一致,组件内部需要判断是否与自己的默认配置有变化,如果由变化需要更新配置。
2、功能
解析外部参数文件,配置外部参数(如果有)执行组件安装(包括环境依赖检查)。记录安装日志。
3、要求规范
安装目录均为 /opt/module/组件名/version
这样的,这样做的好处是便于后期做回滚。
例如下图所示:
nginx配置文件的存放目录为 /opt/module/nginx/conf.d/
。
2.3 启动脚本 start.sh
启动考虑两种方法,第一种是service启动,第二种是nohup启动。
下面是一个示例,考虑采用 service 启动的情况。这样,脚本不仅能通过 nohup 启动进程,还能支持通过 systemctl 来管理服务,确保系统能够适应不同的部署方式。
#!/bin/bashSERVICE_NAME="app.service"
JAR_PATH="/opt/module/app.jar"
LOG_PATH="/opt/module/logs/app.log"# 检查 systemd 服务是否存在
if systemctl list-units --type=service | grep -q "$SERVICE_NAME"; thenecho "通过 systemctl 启动服务..."systemctl start $SERVICE_NAME
elseecho "通过 nohup 启动服务..."nohup java -jar $JAR_PATH > $LOG_PATH 2>&1 &
fi# 检查进程是否成功启动
sleep 5
ps aux | grep app.jar | grep -v grepecho "服务已启动"
start.sh: 如果 systemd 服务已经存在且可用,则通过 systemctl start 启动服务;否则,回退到使用 nohup 启动。
2.4 停止脚本 stop.sh
#!/bin/bashSERVICE_NAME="app.service"# 检查 systemd 服务是否存在
if systemctl list-units --type=service | grep -q "$SERVICE_NAME"; thenecho "通过 systemctl 停止服务..."systemctl stop $SERVICE_NAME
elseecho "通过 pkill 停止服务..."pkill -f app.jarsleep 3# 确保进程完全终止if pgrep -f app.jar > /dev/null; thenecho "进程未成功终止,强制杀死"pkill -9 -f app.jarfi
fiecho "服务已停止"
stop.sh: 通过 systemctl stop 停止服务,如果服务未通过 systemd 启动,则通过 pkill 停止进程。
2.5 运行状态检查脚本 status.sh
#!/bin/bashSERVICE_NAME="app.service"# 检查 systemd 服务是否存在
if systemctl list-units --type=service | grep -q "$SERVICE_NAME"; thenecho "服务通过 systemctl 运行中"systemctl status $SERVICE_NAME
elseif pgrep -f app.jar > /dev/null; thenecho "服务通过 nohup 运行中"ps -eo pid,%cpu,%mem,cmd | grep app.jar | grep -v grepelseecho "服务未运行"fi
fi
status.sh: 如果服务是通过 systemd 启动,则使用 systemctl status 来检查状态;如果不是,则使用 ps 来检查进程。
2.6 升级脚本 upgrade.sh
#!/bin/bash# 备份当前安装目录
echo "开始备份当前版本..."
cp -r /opt/module /opt/module_backup# 检查是否已经存在新的安装脚本
if [ -f "/opt/module/install.sh" ]; thenecho "开始执行安装脚本..."/opt/module/install.sh
elseecho "安装脚本不存在,无法进行升级"exit 1
fiecho "升级完成"
原创 demo123567 海燕技术栈