3. 自愈剧本核心概念:事件驱动、告警触发、动作执行、状态回写
自愈剧本(Runbook)的本质是将运维经验转化为可自动执行的决策树。理解其核心概念是编写高质量剧本的前提。本章围绕四个关键环节展开:事件驱动、告警触发、动作执行、状态回写,它们构成了自愈剧本的完整生命周期。
3.1 核心概念总览
下表对比了四个核心概念在自愈剧本中的角色与关键特征:
| 概念 | 角色 | 关键特征 | 典型输出 |
|---|---|---|---|
| 事件驱动 | 剧本的启动器 | 异步、非轮询、基于消息 | Webhook 请求 / 消息队列事件 |
| 告警触发 | 剧本的决策入口 | 条件匹配、标签过滤、抑制/静默 | Prometheus Alertmanager 通知 |
| 动作执行 | 剧本的治疗手段 | 幂等性、超时控制、重试策略 | API 调用 / 脚本执行 / 配置变更 |
| 状态回写 | 剧本的闭环反馈 | 持久化、幂等、可审计 | 告警注释更新 / 指标记录 / 事件日志 |
3.2 事件驱动:剧本的启动器
自愈剧本不应采用轮询方式检查状态,而应基于事件驱动模型。当 Prometheus Alertmanager 发送告警通知时,该通知即是一个事件。剧本引擎(如 Ansible Tower、StackStorm、自定义 Runner)通过监听 Webhook 或消息队列来接收事件。
- 事件源:Alertmanager Webhook、Kafka 主题、CloudEvents、自定义 HTTP 回调。
- 事件格式:通常为 JSON 结构,包含告警名称、标签、注解、状态(firing/resolved)、时间戳。
- 事件过滤:剧本引擎根据事件中的标签(如
severity="critical")决定是否启动对应剧本。
最佳实践: 事件驱动要求剧本引擎具备高可用和去重能力。建议在事件入口处使用消息队列缓冲,防止突发告警导致剧本并发失控。
3.3 告警触发:从事件到剧本的映射
告警触发是事件驱动后的第一道决策门。剧本需要根据告警的标签和注解匹配到正确的处理流程。
典型的告警触发匹配逻辑:
# 伪代码:告警触发匹配
def match_playbook(alert):
if alert.labels.get("alertname") == "HighCpuUsage" and \
alert.labels.get("severity") == "critical":
return "cpu_throttling_playbook"
elif alert.labels.get("alertname") == "DiskSpaceFull" and \
alert.labels.get("instance").startswith("prod-"):
return "disk_cleanup_playbook"
else:
return None # 不触发自愈
触发阶段需要处理的关键问题:
- 抑制与静默:避免同一告警重复触发多个剧本实例。
- 标签继承:将告警标签传递给剧本上下文,供后续动作使用。
- 触发条件:支持 AND/OR 逻辑组合,以及基于时间窗口的聚合条件。
3.4 动作执行:剧本的治疗手段
动作执行是自愈剧本的核心治疗环节。每个动作应具备幂等性,即多次执行产生相同结果,避免重复操作导致系统状态恶化。
常见动作类型:
| 动作类型 | 示例 | 幂等性要求 |
|---|---|---|
| API 调用 | 重启服务、扩缩容、修改配置 | 高(需检查当前状态再操作) |
| 脚本执行 | 清理日志、重启进程、回滚版本 | 中(需加入前置条件检查) |
| 配置变更 | 更新 DNS 记录、修改负载均衡权重 | 高(使用声明式配置工具) |
| 通知发送 | 发送 Slack、邮件、PagerDuty | 低(但需防重复通知风暴) |
避坑指南: 动作执行必须设置超时(Timeout)和重试(Retry)策略。建议超时默认为 60 秒,重试次数不超过 3 次,且重试间隔采用指数退避。避免动作卡死导致剧本引擎资源耗尽。
3.5 状态回写:剧本的闭环反馈
状态回写是自愈剧本区别于一次性脚本的关键特征。执行完动作后,剧本必须将结果回写到监控系统或告警平台,形成闭环。
回写内容通常包括:
- 执行结果:成功/失败/部分成功。
- 执行详情:执行了哪些动作、耗时、输出日志。
- 状态变更:更新告警的注解(annotation),例如添加
auto_recovery_attempted=true。 - 指标记录:向 Prometheus 推送自愈执行指标(如
playbook_execution_total、playbook_duration_seconds)。
回写方式示例(通过 Alertmanager API 更新告警注解):
# 使用 curl 更新告警注解
curl -X POST http://alertmanager:9093/api/v2/alerts \
-H "Content-Type: application/json" \
-d '[
{
"labels": {
"alertname": "HighCpuUsage",
"instance": "web-01"
},
"annotations": {
"auto_recovery_attempted": "true",
"auto_recovery_result": "success",
"auto_recovery_timestamp": "2025-03-20T10:30:00Z"
}
}
]'
3.6 核心概念关系图
下图展示了四个核心概念在自愈剧本中的流转关系:
3.7 剧本执行状态机
自愈剧本在执行过程中经历多个状态。理解状态机有助于设计健壮的剧本逻辑:
关键设计原则: 状态机中的每个状态转换都应记录日志。特别是“失败”状态,必须包含失败原因和上下文快照,便于事后审计和剧本调优。