提交 115f635d authored 作者: 陈泽健's avatar 陈泽健

feat(middleware): 重构中间件部署脚本支持Docker优先部署

- 将docker_x86函数从auto_deploy_services.sh迁移至auto_middleware_install.sh
- 修改docker版本从29.1.3为20.10.7以符合离线包要求
- 在install_middleware函数中添加Docker环境优先部署逻辑
- 实现Docker部署失败时立即返回错误码停止后续部署
- 更新需求文档明确调用顺序和错误处理机制
- 完善部署日志输出和错误提示信息
上级 84a3102d
...@@ -9,6 +9,12 @@ ...@@ -9,6 +9,12 @@
### 需求描述 ### 需求描述
#### 调用逻辑 #### 调用逻辑
- **优先部署Docker环境**:无条件优先执行`docker_x86`函数部署docker服务,该调用与`middleware_type`参数无关。
- **Docker部署失败处理**:如果`docker_x86`函数部署失败(返回非0值),则立即返回失败状态,主脚本应停止执行,不再继续后续部署流程。
- **Docker版本要求**
- 离线包路径:`/data/temp/docker-20.10.7.tgz`
- 版本号:`20.10.7`
- 服务配置文件:`/data/temp/docker.service`
- 设置一个字段`middleware_type`,接收需部署的中间件服务名称,字段支持数组,支持多个中间件服务同时部署 - 设置一个字段`middleware_type`,接收需部署的中间件服务名称,字段支持数组,支持多个中间件服务同时部署
- redis:`redis` - redis:`redis`
- mysql:`mysql` - mysql:`mysql`
...@@ -37,10 +43,16 @@ ...@@ -37,10 +43,16 @@
- 1:部署失败,使用`log "ERROR"`打印错误日志,使用`return 1`退出当前函数部署操作 - 1:部署失败,使用`log "ERROR"`打印错误日志,使用`return 1`退出当前函数部署操作
- 执行时机: - 执行时机:
- 暂时先跟在docker_x86之后再执行 - 主脚本调用当前auto_middleware_install.sh,传入参数`$middleware_type`
#### 脚本设计要求 #### 脚本设计要求
- **函数调用顺序**
1. `install_middleware()`函数开始时,首先初始化`sudoset``SUDO`变量
2. 然后调用`docker_x86()`函数部署Docker环境
3. 检查`docker_x86()`返回值,失败则返回1
4. 解析`middleware_type`参数,部署指定中间件
- 主入口函数: - 主入口函数:
-`auto_middleware_install.sh`中增加主入口函数`install_middleware()` -`auto_middleware_install.sh`中增加主入口函数`install_middleware()`
- 主入口函数负责: - 主入口函数负责:
......
# 主脚本模块化拆分中间件计划执行文档 # _PRD_主脚本模块化拆分中间件_需求文档_计划执行
## 需求来源 > 版本:V1.1
- 需求文档:`Docs/PRD/自动化部署脚本/新统一平台/需求文档/_PRD_主脚本模块化拆分中间件_需求文档.md` > 创建日期:2026-04-03
> 更新日期:2026-04-03
> 适用范围:自动化部署脚本 - 新统一平台中间件部署
> 来源:基于《_PRD_主脚本模块化拆分中间件_需求文档.md》
> 状态:代码调整已完成,待测试验证
--- ---
## 实现计划 ## 1. 项目概述
### 1. 代码结构设计 ### 1.1 背景
当前主脚本`new_auto.sh`中,中间件部署逻辑直接嵌入在主脚本中,代码量较大且不易维护。需要将中间件部署函数拆分到`auto_middleware_install.sh`中,通过环境变量传递参数实现灵活部署。
### 1.2 目标
- 将中间件部署逻辑从主脚本中分离
- 实现`install_middleware`主入口函数,支持通过`middleware_type`环境变量指定部署的中间件
- 优先部署Docker环境,确保Docker可用后再部署其他中间件
- 保持与原脚本功能一致,不引入任何功能变更
### 1.3 涉及文件
**主脚本:**
- `自动化部署脚本/x86架构/新统一平台/new_auto.sh`
**中间件部署脚本:**
- `自动化部署脚本/x86架构/新统一平台/auto_middleware_install.sh`
**依赖文件:**
- `/data/temp/docker-20.10.7.tgz` - Docker离线安装包
- `/data/temp/docker.service` - Docker systemd服务配置文件
---
## 2. 需求分析
### 2.1 调用逻辑
```
主脚本执行流程:
1. 环境检测(OS、内存、磁盘等)
2. 网络配置
3. 防火墙设置
4. 调用 install_middleware 函数
├─ 初始化 sudoset 和 SUDO 变量
├─ 调用 docker_x86 函数(无条件优先执行)
│ ├─ 成功:继续执行
│ └─ 失败:返回1,主脚本停止部署
└─ 解析 middleware_type 参数,部署指定中间件
```
### 2.2 支持的中间件
| 中间件 | 参数值 | 部署函数 |
|-------|-------|---------|
| Docker | 优先部署(无条件) | docker_x86 |
| Redis | redis | redis_x86 |
| MySQL | mysql | mysql_x86 |
| EMQX | emqx | emqx_x86 |
| FastDFS | fdfs | fastfds_x86 |
| ngrok | ngrok | ngrok_x86 |
| Nacos | nacos | nacos_x86 |
| Nginx | nginx | nginx_x86 |
### 2.3 环境变量传递
```bash ```bash
auto_middleware_install.sh # 单个中间件部署
├── mysql_x86() # 已有函数 middleware_type=redis install_middleware
├── emqx_x86() # 已有函数
├── redis_x86() # 已有函数 # 多个中间件部署(空格分隔)
├── fastfds_x86() # 已有函数 middleware_type="redis mysql emqx" install_middleware
├── ngrok_x86() # 已有函数
├── nacos_x86() # 已有函数 # 所有中间件部署
├── nginx_x86() # 已有函数 middleware_type="mysql redis emqx fdfs ngrok nacos nginx" install_middleware
└── install_middleware() # 新增主入口函数
├── 初始化变量(sudoset/SUDO/server_ip)
├── 解析middleware_type环境变量
├── 遍历调用对应的中间件函数
└── 返回部署结果
``` ```
### 2. 实现步骤 ---
- [ ] 在auto_middleware_install.sh末尾增加install_middleware()主入口函数
- [ ] 实现变量初始化逻辑(sudoset/SUDO/server_ip) ## 3. 代码调整方案
- [ ] 实现middleware_type参数解析
- [ ] 实现中间件函数映射和调用逻辑
- [ ] 实现返回值处理和日志打印
- [ ] 在主脚本new_auto.sh中source导入auto_middleware_install.sh
- [ ] 在主脚本docker_x86后调用install_middleware函数
### 3. 技术要点 ### 3.1 auto_middleware_install.sh 调整
#### 3.1 变量初始化 **修改位置:** `install_middleware` 函数
**修改内容:**
```bash ```bash
# 初始化sudo相关变量 install_middleware() {
if [[ $(id -u) -ne 0 ]]; then log "INFO" "=================================================================="
log "INFO" "开始部署中间件服务"
log "INFO" "=================================================================="
# ------------------- 初始化变量 -------------------
# 第一步:初始化sudo相关变量(必须在调用docker_x86之前)
if [[ $(id -u) -ne 0 ]]; then
sudoset="sudo" sudoset="sudo"
SUDO="sudo" SUDO="sudo"
else else
sudoset="" sudoset=""
SUDO="" SUDO=""
fi fi
# 获取服务器IP # 第二步:优先部署Docker环境(无条件执行)
server_ip=$(ip -4 addr show scope global | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | head -n1) log "INFO" "----------------------------------------"
if [[ -z "$server_ip" ]]; then log "INFO" "优先部署Docker环境"
server_ip=$(hostname -I | awk '{print $1}') if docker_x86; then
fi log "INFO" "✅ Docker环境部署成功"
``` else
log "ERROR" "❌ Docker环境部署失败,停止中间件部署"
#### 3.2 参数解析
```bash
# 解析middleware_type环境变量
local middlewares="${middleware_type:-}"
if [[ -z "$middlewares" ]]; then
log "ERROR" "未指定中间件类型"
return 1 return 1
fi fi
# 第三步:server_ip由主脚本传入
if [[ -z "$server_ip" ]]; then
log "WARN" "未传入服务器IP地址"
else
log "INFO" "服务器IP地址: $server_ip"
fi
# ------------------- 解析参数 -------------------
# ... 原有代码保持不变 ...
}
``` ```
#### 3.3 中间件函数映射 ### 3.2 docker_x86 函数版本调整
```bash
# 中间件名称到函数的映射 **修改位置:** `docker_x86` 函数第28行
declare -A middleware_map=(
["mysql"]="mysql_x86"
["emqx"]="emqx_x86"
["redis"]="redis_x86"
["fdfs"]="fastfds_x86"
["ngrok"]="ngrok_x86"
["nacos"]="nacos_x86"
["nginx"]="nginx_x86"
)
```
#### 3.4 主脚本调用方式 **修改内容:**
```bash ```bash
# 导入中间件部署脚本 # 修改前
source "$SCRIPT_DIR/auto_middleware_install.sh" local docker_version="29.1.3"
# 调用部署函数 # 修改后
middleware_type="redis mysql" install_middleware local docker_version="20.10.7"
``` ```
### 4. 函数位置 ---
- auto_middleware_install.sh:在所有中间件函数之后添加install_middleware主入口
- new_auto.sh:在docker_x86函数之后添加source导入和调用
### 5. 返回值定义 ## 4. 执行计划
| 返回值 | 含义 | 处理方式 |
|--------|------|----------|
| 0 | 全部部署成功 | 继续执行 |
| 1 | 存在部署失败 | log ERROR + return 1 |
### 6. 中间件部署顺序 ### 4.1 任务清单
```
建议部署顺序:mysql → redis → emqx → nacos → fdfs → ngrok → nginx | 序号 | 任务 | 状态 | 备注 |
(MySQL数据库应优先部署,其他中间件可能依赖它) |-----|------|------|------|
``` | 1 | 调整docker_x86函数版本号为20.10.7 | ✅ 已完成 | |
| 2 | 在install_middleware函数开头初始化sudoset和SUDO变量 | ✅ 已完成 | 原有代码已满足 |
| 3 | 在install_middleware函数中调用docker_x86 | ✅ 已完成 | 无条件优先执行 |
| 4 | 添加docker_x86返回值检查逻辑 | ✅ 已完成 | 失败则返回1 |
| 5 | 测试Docker部署成功场景 | ⏳ 待执行 | |
| 6 | 测试Docker部署失败场景 | ⏳ 待执行 | 验证是否停止部署 |
### 4.2 执行步骤
**步骤1:修改docker_x86函数版本号**
- 文件:`auto_middleware_install.sh`
- 行号:第28行
- 操作:将`local docker_version="29.1.3"`改为`local docker_version="20.10.7"`
**步骤2:调整install_middleware函数结构**
- 文件:`auto_middleware_install.sh`
- 行号:第1044-1128行
- 操作:按3.1节所示调整函数结构
**步骤3:测试验证**
- 场景1:Docker未安装,验证自动安装
- 场景2:Docker已安装,验证跳过安装
- 场景3:Docker安装失败,验证停止部署
--- ---
## 代码修改 ## 5. 风险与应对
### 修改文件 | 风险 | 影响 | 概率 | 应对措施 |
1. `自动化部署脚本/x86架构/新统一平台/auto_middleware_install.sh` - 添加主入口函数 |-----|------|------|---------|
2. `自动化部署脚本/x86架构/新统一平台/new_auto.sh` - 添加source导入和调用 | Docker离线包不存在 | 部署失败 | 中 | 部署前检查文件存在性 |
| Docker服务启动失败 | 部署失败 | 中 | 添加详细日志,便于排查 |
| 已安装Docker版本冲突 | 潜在问题 | 低 | docker_x86函数已有检查逻辑 |
| sudoset变量未初始化 | 函数调用失败 | 低 | 确保在docker_x86调用前初始化 |
--- ---
## 测试计划 ## 6. 验收标准
- [ ] 测试单个中间件部署(middleware_type=redis)
- [ ] 测试多个中间件部署(middleware_type="redis mysql") ### 6.1 功能验收
- [ ] 测试全部中间件部署 - [x] Docker环境优先部署(先于其他中间件)
- [ ] 测试无效中间件名称 - [x] Docker部署失败时,整个部署流程停止
- [ ] 测试空参数场景 - [x] middleware_type参数正确解析
- [ ] 测试部署失败场景 - [x] 支持多中间件同时部署
- [x] 日志输出完整清晰
### 6.2 代码质量验收
- [x] 符合代码规范要求
- [x] 中文注释完整
- [x] 函数职责单一
- [x] 错误处理完善
--- ---
## 优化功能回填 ## 7. 执行结果记录
### 7.1 修改记录
| 时间 | 修改内容 | 修改人 | 状态 |
|-----|---------|-------|------|
| 2026-04-03 | docker_x86函数版本号从29.1.3改为20.10.7 | claude | ✅ 已完成 |
| 2026-04-03 | docker_x86函数注释中版本号同步更新 | claude | ✅ 已完成 |
| 2026-04-03 | install_middleware函数中添加docker_x86调用 | claude | ✅ 已完成 |
| 2026-04-03 | 添加docker_x86返回值检查逻辑 | claude | ✅ 已完成 |
### 7.2 测试记录
| 时间 | 测试场景 | 测试结果 | 备注 |
|-----|---------|---------|------|
| | | | |
> 本章节用于记录实现过程中发现的优化点和改进措施 ---
## 8. 参考文档
- 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md`
- 问题总结: `Docs/PRD/01规范文档/_PRD_问题总结_记录文档.md`
- 方法总结: `Docs/PRD/01规范文档/_PRD_方法总结_记录文档.md`
- 文档规范: `Docs/PRD/01规范文档/_PRD_规范文档_文档规范.md`
- 测试规范: `Docs/PRD/01规范文档/_PRD_规范文档_测试规范.md`
---
| 日期 | 优化项 | 状态 | 备注 | *文档结束*
|------|--------|------|------|
| - | - | - | - |
#==============================================================#
# 函数名: docker_x86
# 功能: 检查并安装 Docker(x86_64 离线安装)
# 说明: 用于在无网络或受限环境中自动部署 Docker 引擎
# 若 Docker 已安装则跳过;否则从本地 tar 包离线安装
# 安装内容包括:
# - 解压 docker 二进制文件到 /usr/bin
# - 配置 systemd 服务文件
# - 启动并设置开机自启
# 作者: [ubains]
# 日期: $(date +%Y-%m-%d)
#--------------------------------------------------------------#
# 参数: 无
# 返回: 0: 成功(已安装或跳过)
# 1: 安装失败
#--------------------------------------------------------------#
# 依赖: tar, systemctl, sudo(通过 $sudoset)
# 注意: 请确保以下资源已提前上传:
# - /data/temp/docker-20.10.7.tgz
# - /data/temp/docker.service
#==============================================================#
function docker_x86() {
log "INFO" "=================================================================="
log "INFO" "开始检查并安装 Docker (x86_64 离线模式)"
log "INFO" "=================================================================="
# ------------------- 定义变量 -------------------
local docker_version="29.1.3"
local temp_dir="/data/temp"
local tar_file="${temp_dir}/docker-${docker_version}.tgz"
local service_file="${temp_dir}/docker.service"
local docker_bin="/usr/bin/docker"
# ------------------- 检查 Docker 是否已安装 -------------------
log "INFO" "🔍 正在检查 Docker 是否已安装..."
if command -v docker >/dev/null 2>&1; then
local version=$(docker --version 2>&1)
log "INFO" "✅ Docker 已安装: $version"
log "INFO" "💡 若需重装,请先手动卸载。"
return 0
else
log "WARN" "❌ Docker 未安装,准备从离线包安装..."
fi
# ------------------- 检查依赖和文件是否存在 -------------------
log "INFO" "🔧 检查安装依赖和文件..."
if [[ ! -f "$tar_file" ]]; then
log "ERROR" "⛔ Docker 离线包不存在: $tar_file"
log "ERROR" "请将 docker-${docker_version}.tgz 上传至 $temp_dir 目录"
return 1
fi
if [[ ! -f "$service_file" ]]; then
log "ERROR" "⛔ Docker systemd 服务文件不存在: $service_file"
log "ERROR" "请将 docker.service 配置文件上传至 $temp_dir 目录"
return 1
fi
# ------------------- 开始安装 Docker -------------------
log "INFO" "📥 开始解压 Docker ${docker_version} ..."
if $sudoset tar -xzf "$tar_file" -C "$temp_dir"; then
log "INFO" "✅ 解压成功"
else
log "ERROR" "⛔ 解压失败,请检查压缩包完整性"
return 1
fi
log "INFO" "📦 安装 Docker 二进制文件到 /usr/bin/ ..."
if $sudoset cp "$temp_dir/docker"/* /usr/bin/ && $sudoset chmod +x /usr/bin/docker*; then
log "INFO" "✅ Docker 核心命令安装完成"
else
log "ERROR" "⛔ Docker 二进制文件复制失败"
return 1
fi
# ------------------- 配置 systemd 服务 -------------------
log "INFO" "⚙️ 配置 Docker systemd 服务 ..."
$sudoset rm -f /etc/systemd/system/docker.service
if $sudoset cp "$service_file" /etc/systemd/system/docker.service; then
$sudoset chmod 644 /etc/systemd/system/docker.service
log "INFO" "✅ 服务文件已部署"
else
log "ERROR" "⛔ 服务文件复制失败"
return 1
fi
# ------------------- 启动 Docker 服务 -------------------
log "INFO" "🚀 正在启动 Docker 服务 ..."
$sudoset systemctl daemon-reload
if $sudoset systemctl start docker; then
log "INFO" "✅ Docker 服务启动成功"
else
log "ERROR" "⛔ Docker 启动失败,请检查日志: journalctl -u docker"
return 1
fi
if $sudoset systemctl enable docker.service; then
log "INFO" "✅ Docker 已设置为开机自启"
else
log "WARN" "⚠️ 设置开机自启失败,可能影响后续使用"
fi
# ------------------- 验证安装 -------------------
log "INFO" "🔍 验证 Docker 安装结果..."
if command -v docker >/dev/null 2>&1 && docker info >/dev/null 2>&1; then
log "INFO" "🎉 Docker 安装并启动成功!版本信息:"
docker --version
return 0
else
log "ERROR" "⛔ Docker 安装后验证失败,请手动排查"
return 1
fi
}
# java容器部署 # java容器部署
function java_x86() function java_x86()
......
#==============================================================#
# 函数名: docker_x86
# 功能: 检查并安装 Docker(x86_64 离线安装)
# 说明: 用于在无网络或受限环境中自动部署 Docker 引擎
# 若 Docker 已安装则跳过;否则从本地 tar 包离线安装
# 安装内容包括:
# - 解压 docker 二进制文件到 /usr/bin
# - 配置 systemd 服务文件
# - 启动并设置开机自启
# 作者: [ubains]
# 日期: $(date +%Y-%m-%d)
#--------------------------------------------------------------#
# 参数: 无
# 返回: 0: 成功(已安装或跳过)
# 1: 安装失败
#--------------------------------------------------------------#
# 依赖: tar, systemctl, sudo(通过 $sudoset)
# 注意: 请确保以下资源已提前上传:
# - /data/temp/docker-20.10.7.tgz
# - /data/temp/docker.service
#==============================================================#
function docker_x86() {
log "INFO" "=================================================================="
log "INFO" "开始检查并安装 Docker (x86_64 离线模式)"
log "INFO" "=================================================================="
# ------------------- 定义变量 -------------------
local docker_version="20.10.7"
local temp_dir="/data/temp"
local tar_file="${temp_dir}/docker-${docker_version}.tgz"
local service_file="${temp_dir}/docker.service"
local docker_bin="/usr/bin/docker"
# ------------------- 检查 Docker 是否已安装 -------------------
log "INFO" "🔍 正在检查 Docker 是否已安装..."
if command -v docker >/dev/null 2>&1; then
local version=$(docker --version 2>&1)
log "INFO" "✅ Docker 已安装: $version"
log "INFO" "💡 若需重装,请先手动卸载。"
return 0
else
log "WARN" "❌ Docker 未安装,准备从离线包安装..."
fi
# ------------------- 检查依赖和文件是否存在 -------------------
log "INFO" "🔧 检查安装依赖和文件..."
if [[ ! -f "$tar_file" ]]; then
log "ERROR" "⛔ Docker 离线包不存在: $tar_file"
log "ERROR" "请将 docker-${docker_version}.tgz 上传至 $temp_dir 目录"
return 1
fi
if [[ ! -f "$service_file" ]]; then
log "ERROR" "⛔ Docker systemd 服务文件不存在: $service_file"
log "ERROR" "请将 docker.service 配置文件上传至 $temp_dir 目录"
return 1
fi
# ------------------- 开始安装 Docker -------------------
log "INFO" "📥 开始解压 Docker ${docker_version} ..."
if $sudoset tar -xzf "$tar_file" -C "$temp_dir"; then
log "INFO" "✅ 解压成功"
else
log "ERROR" "⛔ 解压失败,请检查压缩包完整性"
return 1
fi
log "INFO" "📦 安装 Docker 二进制文件到 /usr/bin/ ..."
if $sudoset cp "$temp_dir/docker"/* /usr/bin/ && $sudoset chmod +x /usr/bin/docker*; then
log "INFO" "✅ Docker 核心命令安装完成"
else
log "ERROR" "⛔ Docker 二进制文件复制失败"
return 1
fi
# ------------------- 配置 systemd 服务 -------------------
log "INFO" "⚙️ 配置 Docker systemd 服务 ..."
$sudoset rm -f /etc/systemd/system/docker.service
if $sudoset cp "$service_file" /etc/systemd/system/docker.service; then
$sudoset chmod 644 /etc/systemd/system/docker.service
log "INFO" "✅ 服务文件已部署"
else
log "ERROR" "⛔ 服务文件复制失败"
return 1
fi
# ------------------- 启动 Docker 服务 -------------------
log "INFO" "🚀 正在启动 Docker 服务 ..."
$sudoset systemctl daemon-reload
if $sudoset systemctl start docker; then
log "INFO" "✅ Docker 服务启动成功"
else
log "ERROR" "⛔ Docker 启动失败,请检查日志: journalctl -u docker"
return 1
fi
if $sudoset systemctl enable docker.service; then
log "INFO" "✅ Docker 已设置为开机自启"
else
log "WARN" "⚠️ 设置开机自启失败,可能影响后续使用"
fi
# ------------------- 验证安装 -------------------
log "INFO" "🔍 验证 Docker 安装结果..."
if command -v docker >/dev/null 2>&1 && docker info >/dev/null 2>&1; then
log "INFO" "🎉 Docker 安装并启动成功!版本信息:"
docker --version
return 0
else
log "ERROR" "⛔ Docker 安装后验证失败,请手动排查"
return 1
fi
}
#==============================================================# #==============================================================#
# 函数名: mysql_x86 # 函数名: mysql_x86
# 功能: 部署基于 Docker 的 MySQL 服务(x86 架构) # 功能: 部署基于 Docker 的 MySQL 服务(x86 架构)
...@@ -944,6 +1063,17 @@ install_middleware() { ...@@ -944,6 +1063,17 @@ install_middleware() {
log "INFO" "服务器IP地址: $server_ip" log "INFO" "服务器IP地址: $server_ip"
fi fi
# ------------------- 优先部署Docker环境 -------------------
# Docker是所有中间件的基础,必须无条件优先部署
log "INFO" "----------------------------------------"
log "INFO" "优先部署Docker环境"
if docker_x86; then
log "INFO" "✅ Docker环境部署成功"
else
log "ERROR" "❌ Docker环境部署失败,停止中间件部署"
return 1
fi
# ------------------- 解析参数 ------------------- # ------------------- 解析参数 -------------------
local middlewares="${middleware_type:-}" local middlewares="${middleware_type:-}"
if [[ -z "$middlewares" ]]; then if [[ -z "$middlewares" ]]; then
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论