提交 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 @@
### 需求描述
#### 调用逻辑
- **优先部署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`,接收需部署的中间件服务名称,字段支持数组,支持多个中间件服务同时部署
- redis:`redis`
- mysql:`mysql`
......@@ -37,10 +43,16 @@
- 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()`
- 主入口函数负责:
......
# 主脚本模块化拆分中间件计划执行文档
# _PRD_主脚本模块化拆分中间件_需求文档_计划执行
## 需求来源
- 需求文档:`Docs/PRD/自动化部署脚本/新统一平台/需求文档/_PRD_主脚本模块化拆分中间件_需求文档.md`
> 版本:V1.1
> 创建日期: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
auto_middleware_install.sh
├── mysql_x86() # 已有函数
├── emqx_x86() # 已有函数
├── redis_x86() # 已有函数
├── fastfds_x86() # 已有函数
├── ngrok_x86() # 已有函数
├── nacos_x86() # 已有函数
├── nginx_x86() # 已有函数
└── install_middleware() # 新增主入口函数
├── 初始化变量(sudoset/SUDO/server_ip)
├── 解析middleware_type环境变量
├── 遍历调用对应的中间件函数
└── 返回部署结果
# 单个中间件部署
middleware_type=redis install_middleware
# 多个中间件部署(空格分隔)
middleware_type="redis mysql emqx" install_middleware
# 所有中间件部署
middleware_type="mysql redis emqx fdfs ngrok nacos nginx" install_middleware
```
### 2. 实现步骤
- [ ] 在auto_middleware_install.sh末尾增加install_middleware()主入口函数
- [ ] 实现变量初始化逻辑(sudoset/SUDO/server_ip)
- [ ] 实现middleware_type参数解析
- [ ] 实现中间件函数映射和调用逻辑
- [ ] 实现返回值处理和日志打印
- [ ] 在主脚本new_auto.sh中source导入auto_middleware_install.sh
- [ ] 在主脚本docker_x86后调用install_middleware函数
---
## 3. 代码调整方案
### 3. 技术要点
### 3.1 auto_middleware_install.sh 调整
#### 3.1 变量初始化
**修改位置:** `install_middleware` 函数
**修改内容:**
```bash
# 初始化sudo相关变量
if [[ $(id -u) -ne 0 ]]; then
install_middleware() {
log "INFO" "=================================================================="
log "INFO" "开始部署中间件服务"
log "INFO" "=================================================================="
# ------------------- 初始化变量 -------------------
# 第一步:初始化sudo相关变量(必须在调用docker_x86之前)
if [[ $(id -u) -ne 0 ]]; then
sudoset="sudo"
SUDO="sudo"
else
else
sudoset=""
SUDO=""
fi
# 获取服务器IP
server_ip=$(ip -4 addr show scope global | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | head -n1)
if [[ -z "$server_ip" ]]; then
server_ip=$(hostname -I | awk '{print $1}')
fi
```
#### 3.2 参数解析
```bash
# 解析middleware_type环境变量
local middlewares="${middleware_type:-}"
if [[ -z "$middlewares" ]]; then
log "ERROR" "未指定中间件类型"
fi
# 第二步:优先部署Docker环境(无条件执行)
log "INFO" "----------------------------------------"
log "INFO" "优先部署Docker环境"
if docker_x86; then
log "INFO" "✅ Docker环境部署成功"
else
log "ERROR" "❌ Docker环境部署失败,停止中间件部署"
return 1
fi
fi
# 第三步:server_ip由主脚本传入
if [[ -z "$server_ip" ]]; then
log "WARN" "未传入服务器IP地址"
else
log "INFO" "服务器IP地址: $server_ip"
fi
# ------------------- 解析参数 -------------------
# ... 原有代码保持不变 ...
}
```
#### 3.3 中间件函数映射
```bash
# 中间件名称到函数的映射
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.2 docker_x86 函数版本调整
**修改位置:** `docker_x86` 函数第28行
#### 3.4 主脚本调用方式
**修改内容:**
```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. 返回值定义
| 返回值 | 含义 | 处理方式 |
|--------|------|----------|
| 0 | 全部部署成功 | 继续执行 |
| 1 | 存在部署失败 | log ERROR + return 1 |
## 4. 执行计划
### 6. 中间件部署顺序
```
建议部署顺序:mysql → redis → emqx → nacos → fdfs → ngrok → nginx
(MySQL数据库应优先部署,其他中间件可能依赖它)
```
### 4.1 任务清单
| 序号 | 任务 | 状态 | 备注 |
|-----|------|------|------|
| 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调用前初始化 |
---
## 测试计划
- [ ] 测试单个中间件部署(middleware_type=redis)
- [ ] 测试多个中间件部署(middleware_type="redis mysql")
- [ ] 测试全部中间件部署
- [ ] 测试无效中间件名称
- [ ] 测试空参数场景
- [ ] 测试部署失败场景
## 6. 验收标准
### 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容器部署
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
# 功能: 部署基于 Docker 的 MySQL 服务(x86 架构)
......@@ -944,6 +1063,17 @@ install_middleware() {
log "INFO" "服务器IP地址: $server_ip"
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:-}"
if [[ -z "$middlewares" ]]; then
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论