清单要回答的问题
验证幂等性本质上是回答几个具体问题:这条任务连续执行两次,被管系统的状态是否发生变化;第二次执行是否报告「有变更」;任务是否包含追加、自增、发送通知等一次性动作;失败中断后能否直接重跑;并发执行是否有互斥保护。清单把这些检查项固定下来,避免凭直觉判断,也便于在评审时逐条确认。
基本信息
| 验证方式 | 非生产环境连续执行两次并对比结果 |
|---|---|
| 关键观察 | 第二次执行是否报告有变更 |
| 重点排查 | 追加、自增、唯一资源创建、对外通知 |
| 失败场景 | 模拟中断后重跑,确认不产生副作用 |
验证清单
- 连续两次执行,第二次是否报告无变更。
- 任务中是否存在追加写入、计数器累加或日志追加动作。
- 创建资源是否带唯一键,重复创建时是被拒绝还是产生副本。
- 是否存在对外副作用(通知、计费、工单),重复触发能否容忍。
- 模拟中途中断后重跑,是否能在半成品状态上继续。
- 并发执行同一任务时是否有锁或串行保护。
- 失败重试是否会放大影响,重试上限是否设置。
- 执行报告是否包含具体的变更内容而不只是成功标记。
用干跑观察变更
用干跑观察变更
# 先看会改什么,不真正执行
ansible-playbook -i prod-hosts site.yml --check --diff
# 正式执行一次,记录变更数
ansible-playbook -i prod-hosts site.yml | tee run1.log
# 立即再执行一次:理想结果是 changed=0
ansible-playbook -i prod-hosts site.yml | tee run2.log
grep -E 'changed=[1-9]' run2.log && echo '警告:第二次执行仍有变更'检查项与判读
| 检查项 | 合格表现 | 不合格表现 |
|---|---|---|
| 二次执行 | 报告无变更 | 每次都报告已变更 |
| 追加动作 | 不存在或已做判断 | 无判断直接追加 |
| 资源创建 | 带唯一键 | 重复创建产生副本 |
| 外部副作用 | 有去重或确认 | 重跑即重复发送 |
| 中断重跑 | 可继续或可回退 | 半成品状态无法处理 |
| 并发保护 | 有锁或串行 | 并发写同一目标 |
| 重试策略 | 限次并退避 | 无限重试放大影响 |
「第二次执行报告无变更」是最直观的合格信号。若每次都报告有变更,先检查模板里是否写入了时间戳、随机串或主机名等每次不同的内容。
验证要在接近生产的环境进行:本地或简化环境通常缺少并发、权限与依赖约束,容易给出过于乐观的结论。