预检与冻结是什么
预检是在动手之前确认前提条件成立,冻结是让环境在操作期间保持稳定,两者通常一起使用。预检覆盖连通性、凭据可用性、提权权限、磁盘剩余空间、依赖服务健康、版本与时间同步、备份可用性;冻结包括暂停可能干扰的自动化(定时任务、自动伸缩、自动修复)、把目标从负载均衡摘除、必要时让业务进入只读或维护模式。原则是预检脚本化,任一硬条件不满足就直接中止,而不是靠人工目测。
基本信息
| 预检项 | 连通性、免密或凭据可用、sudo 权限、磁盘剩余空间、依赖服务状态、版本与时间同步、备份可用 |
|---|---|
| 冻结手段 | 暂停定时任务与自动伸缩、摘除流量、置为只读、静默无关告警 |
| 失败处理 | 硬条件不满足立即中止,并输出具体原因 |
| 关键要求 | 预检结果留档,作为变更记录的一部分 |
典型使用场景
- 大规模变更前的环境体检
- 数据库迁移前冻结写入并确认备份就绪
- 批量重启前暂停自动修复脚本,否则自动逻辑会把变更结果覆盖回去
- 确认所有目标主机时间同步正常,避免日志与租约判定错乱
- 维护窗口开始前把节点从负载均衡摘除
预检与冻结示例
预检与冻结示例
fail=0
for h in $(cat hosts); do
ssh -n -o BatchMode=yes -o ConnectTimeout=5 "$h" 'true' || { echo "$h 连接失败"; fail=1; }
ssh -n "$h" 'df -P / | awk "NR==2{exit !(\$4>1048576)}"' || { echo "$h 磁盘不足"; fail=1; }
done
[ "$fail" -eq 0 ] || { echo '预检未通过,中止'; exit 1; }
# 冻结:暂停会与本次变更冲突的自动化
systemctl stop app-autorepair.timer # 暂停自动修复,避免覆盖变更结果
crontab -l | grep -v 'sync.sh' | crontab - # 变更期间摘掉收集类定时任务预检项与后果
| 预检项 | 检查方式 | 不通过的后果 |
|---|---|---|
| 连通性 | ssh 以 BatchMode 试连 | 中途大量失败,回滚成本陡增 |
| 磁盘空间 | df 检查剩余绝对值 | 写入中途失败并留下半截文件 |
| 依赖服务 | systemctl is-active 与探活接口 | 变更显示成功但业务不可用 |
| 时间同步 | timedatectl 与时间同步服务状态 | 日志顺序错乱,租约与证书判定异常 |
| 备份可用 | 备份文件存在且可读可解压 | 出问题时无法回滚 |
最容易漏掉的预检项是时间同步与备份可读性:时间偏差会让日志、证书有效期、租约、分布式锁的判定全部失真;备份存在但从未验证可恢复,等于没有备份。
不冻结自动化是最隐蔽的失败原因:自动修复、自动伸缩、配置收敛脚本可能在变更过程中把环境改回原状,表现为变更莫名其妙没生效或反复回退,排查时几乎不会第一眼怀疑到它们。