Skip to content
返回运维与 SRE

Runbook 归属

给每 runbook 分负责人和团队;季度审查使 runbook 不腐。

为什么

无主 runbook 是孤儿 — 系统变时(新部署工具、服务改名、迁移 DB)无人更新 runbook,下次事件找到告诉值班跑已不存在命令的 runbook。这是 runbook 腐,是 runbook 真实事件中失败的最常见原因。负责人(团队非人 — 人会走)负责系统变时保持 runbook 当前,季度审查抓漏的腐。审查便宜:每 runbook 在 staging 过步骤;命令失败或链接 404 则修。这样做的团队报 95% runbook 事件中首次工作;不做的报 40% — 失败的 60% 每个花 15 分钟困惑调试。

何时使用

runbook 写时。季度审查所有 runbook;系统变时立即审查其 runbook。

如何做

1. 给每 runbook 分负责人(团队)和主作者
   - 负责人 = 拥有 runbook 所涉系统的团队
   - 存 runbook 前置元:owner: @team-payments,author: @alice
   - 负责人负责保持当前非作者

2. 使 runbook 更新成系统变更清单一部分
   - "服务改名?更新所有引用旧名的 runbook。"
   - "迁移 DB?更新所有 DB runbook 的新连接串。"
   - 代码审查:若变更坏 runbook,要求同 PR 更新 runbook

3. 跑季度 runbook 审计
   - 每 runbook:在 staging 过步骤
   - 每命令成功?每链接解析?验证仍工作?
   - 修或删失败的 runbook;坏 runbook 比无 runbook 更糟

4. 跟踪 runbook 新鲜度作指标
   - "过去 90 天更新的 runbook / 总数" — 目标 >80%
   - 一年未触的 runbook 几乎肯定腐了

5. 删已删告警的 runbook
   - 若删告警(告警疲劳),也删其 runbook
   - 孤 runbook 累积并混淆审计

示例

# runbook/checkout-slo-burn.md(前置元)
---
owner: @team-payments      # 负责保持当前的团队
author: @alice             # 原作者(历史)
last_reviewed: 2026-01-15  # 季度更新
alert: CheckoutSLOBurnRateFast
---

# 季度审计脚本(在 staging 跑):
for rb in runbooks/*.md; do
  owner=$(yq '.owner' "$rb")
  last_reviewed=$(yq '.last_reviewed' "$rb")
  age=$(( (today - last_reviewed) / 30 ))
  if [ $age -gt 3 ]; then
    echo "过期:$rb(负责人:$owner,最后审查:$last_reviewed)"
  fi
done
# 输出:
#   过期:runbook/db-failover.md(负责人:@team-platform,最后审查:2025-08-01)
#   → @team-platform 审查 db-failover.md,在 staging 过步骤,更新或删

# 指标:过去 90 天更新 runbook / 总数 = 42/50 = 84% ✅(目标 >80%)

常见问题

  • ⚠无负责人 — 系统变时无人更新 runbook,下次事件找到跑已不存在命令的 runbook。
  • ⚠负责人是已离团队的人 — runbook 成孤儿;归属分团队非个人。
  • ⚠无季度审查 — runbook 静默腐,runbook 首测是真实事件,这是发现它坏的最坏时。
  • ⚠已删告警的 runbook 留 — 作孤儿累积、混淆审计、浪费审查者时间。

最佳实践

  • ✓在前置元给每 runbook 分团队负责人(非人);负责人在系统变时保持当前。
  • ✓使 runbook 更新成系统变更清单一部分;代码审查拒绝坏 runbook 而不更新的变更。
  • ✓跑季度审计:在 staging 过每 runbook 步骤,修或删失败 — 坏 runbook 比无 runbook 更糟。
  • ✓跟踪"过去 90 天更新 runbook / 总数"作指标;目标 >80%,删告警时删 runbook。