为什么两端都要做
任务返回成功只说明命令执行完毕,不说明目标状态正确:配置写入了但服务没重载、进程起来了但端口没监听、端口在监听但上游连接被拒绝。前置检查解决「在不该动手的时候动手」,例如目标磁盘已满、依赖服务未就绪、当前处于变更禁期;后置校验解决「改完了其实没生效」。两者都要能自动判定,否则等于没有。
基本信息
| 前置检查 | 环境、权限、依赖、变更窗口是否满足 |
|---|---|
| 后置校验 | 服务状态、端口、日志、业务探活是否正常 |
| 失败处理 | 前置失败不执行变更,后置失败触发回退或告警 |
| 判定要求 | 输出明确成功或失败,不依赖人工看图 |
常用检查项
- 前置:目标磁盘剩余空间与内存余量是否足够。
- 前置:依赖服务与数据库是否可达、有无正在进行的变更。
- 前置:执行账号权限与提权配置是否可用。
- 后置:服务进程与单元状态是否为运行中。
- 后置:端口是否处于监听且连接可用。
- 后置:日志中是否出现启动完成关键字,或是否出现错误关键字。
两端检查的写法
两端检查的写法
# 前置:空间不足直接退出,不进入变更
avail=$(df -Pm /var | awk 'NR==2 {print $4}')
if [ "${avail}" -lt 2048 ]; then
echo '前置检查失败:/var 可用空间不足 2GB'; exit 1 # 失败即停
fi
systemctl restart app
sleep 3
# 后置:三重校验,任一不通过就算变更失败
systemctl is-active --quiet app || { echo '服务未运行'; exit 1; }
ss -lntp | grep -q ':8080 ' || { echo '端口未监听'; exit 1; }
tail -n 50 /var/log/app/app.log | grep -q 'started' || { echo '未见启动完成日志'; exit 1; }
echo 'OK: 变更已生效'检查项与判读
| 阶段 | 检查项 | 不通过的表现 |
|---|---|---|
| 前置 | 磁盘与内存余量 | 变更中途写入失败 |
| 前置 | 依赖服务可达 | 配置写入成功但业务仍不可用 |
| 前置 | 账号与提权 | 任务中途权限拒绝而中断 |
| 后置 | 服务状态 | 进程未起或反复重启 |
| 后置 | 端口监听 | 服务在跑但未监听预期端口 |
| 后置 | 日志关键字 | 存在错误堆栈或未完成初始化 |
校验要覆盖「使用者视角」:自家健康检查通过不代表业务可用,关键链路最好由业务方提供一条可调用的探活接口,自动化直接调用它判断。
校验也要有时间概念:服务刚重启时接口可能暂时不可用,需设置合理的重试与等待窗口,避免把正常启动过程判为失败。