跳转到主要内容
CFEngine Enterprise 的 Mission Portal 没有 Webhook 通知方式,但告警可以关联自定义动作(Custom action)脚本:告警触发、解除以及发送提醒时,Hub 会执行该脚本,并把告警参数文件的路径作为唯一参数传给它。本集成提供一个脚本,把这个参数文件原样推送到 Flashduty。每条 CFEngine 告警对应一条 Flashduty 告警:触发时打开,解除时自动关闭。
告警和自定义动作只在 CFEngine Enterprise(含 25 台主机以内的免费版)的 Mission Portal 中提供,CFEngine Community 没有这项功能。

在 Flashduty On-call

您可通过以下两种方式获取集成推送地址,任选其一即可。

使用专属集成

  1. 进入 Flashduty 控制台,选择 协作空间,打开一个协作空间
  2. 选择 配置 → 集成数据 → 专属集成,点击 新增集成
  3. 选择 CFEngine,点击 保存
  4. 打开生成的集成卡片,复制 推送地址

使用共享集成

  1. 进入 Flashduty 控制台,选择 集成中心 → 告警事件
  2. 选择 CFEngine,填写集成名称
  3. 配置默认路由并选择协作空间;创建后可在 路由 中增加更多规则
  4. 点击 保存,复制生成的 推送地址

在 CFEngine 中配置

以下步骤基于 CFEngine Enterprise 3.27。上传和关联自定义动作脚本需要 Mission Portal 的 admin 角色。脚本只依赖 Hub 上的 bash 和 curl。
1

准备自定义动作脚本

操作路径:本地文件 flashduty_custom_action.sh(稍后上传到 Mission Portal)创建文件 flashduty_custom_action.sh,内容如下,其中 FLASHDUTY_URL 即 Flashduty 集成的完整推送地址:
脚本不解析参数文件,按原样发送全部 KEY='VALUE' 行,由 Flashduty 解析。Flashduty 拒绝请求或网络不通时,curl 以非零退出码结束。
2

在 Mission Portal 上传脚本

操作路径:Mission Portal › 右上角用户菜单(Hello, 用户名) › Settings › Custom notification scripts › Add a script点击 Save。
3

为告警关联脚本

操作路径:Mission Portal › Dashboard › 新建告警或编辑已有告警 › 通知设置保存告警。一个脚本可以关联多条告警,每条需要推送到 Flashduty 的告警都要关联它。
4

验证告警和恢复

操作路径:CFEngine Hub 上的终端(手动运行脚本);真实告警在 Mission Portal › DashboardCFEngine 没有「发送测试通知」按钮。下面的手动运行只验证链路,用的是一个不属于任何真实告警的 ALERT_ID,不会影响真实告警。先创建 alert_parameters_test:
运行 bash flashduty_custom_action.sh alert_parameters_test,Flashduty 中会出现一条 Info 告警。把文件中的 ALERT_STATUS 改为 'success' 再运行一次,这条告警会关闭。要验证真实告警,可以让告警条件实际满足一次(例如修改一个受策略管理的文件,让 Promise 状态变为 Repaired),等待 Hub 下一次检查告警后确认 Flashduty 收到告警;条件解除后确认告警关闭。几秒后回到 Flashduty,集成显示 最新事件时间,说明配置成功。

Alert Key

Flashduty 用 CFEngine 的告警编号 ALERT_ID 作为 Alert Key。CFEngine 文档说明它是告警的唯一编号;同一条告警的触发、提醒和解除推送都携带相同的 ALERT_ID,因此落在同一条 Flashduty 告警上。告警名称、等级、失败主机数和时间的变化都不会改变 Alert Key。 ALERT_ID 只在一个 Hub 内唯一。有多个 Hub 时,请为每个 Hub 创建单独的 Flashduty 集成,避免不同 Hub 上编号相同的告警互相合并或关闭。 请求缺少 ALERT_ID,或 ALERT_STATUS 不是 fail / success 时,Flashduty 会拒绝该请求。

告警生命周期

一条 CFEngine 告警覆盖它定义的所有主机,Flashduty 为它生成一条告警,失败主机数写在描述和标签中。

状态和告警等级

告警等级取自创建告警时选择的严重度 ALERT_SEVERITY: 恢复事件保留告警的严重度作为等级。

告警内容

  • 标题:告警名称 ALERT_NAME
  • 描述:条件描述 ALERT_CONDITION_DESCRIPTION,以及 Triggered on <失败主机数> of <主机总数> hosts.
  • 标签:check(告警名称),以及参数文件中的其余参数,键名转为小写,例如 alert_id、alert_name、alert_severity、alert_failed_host、alert_total_host、alert_condition_name、alert_condition_type;策略、清单(Inventory)和软件更新类条件的参数也按同样规则写入,例如 alert_policy_condition_filteritemname
时间戳参数(ALERT_LAST_CHECK、ALERT_LAST_EVENT_TIME、ALERT_LAST_STATUS_CHANGE)、ALERT_STATUS 和条件描述不写入标签,空值参数也不写入。每条告警最多 50 个标签;标签过多时,按名称排序后超出部分不写入。

排查问题

  • 脚本报 HTTP 4xx:确认 FLASHDUTY_URL 是完整推送地址且包含 integration_key
  • Mission Portal 中选不到脚本:确认当前用户属于 admin 角色,且脚本已在 Custom notification scripts 中保存
  • 告警没有推送:确认告警关联了脚本;脚本只在告警状态变化和提醒时执行,关联前已经触发的告警要等下一次状态变化或提醒
  • 告警没有恢复:确认 CFEngine 中该告警已解除;在 CFEngine 中删除后重新创建的告警是另一条告警,删除前未关闭的 Flashduty 告警需要手动关闭
参数文件中各参数的含义请参阅 CFEngine 文档 Custom actions for alerts。