apccontrol,apccontrol 再执行 /etc/apcupsd 目录下与事件同名的可执行文件,并把 UPS 名称作为第一个参数传给它。apcupsd 没有原生的 Webhook,用事件脚本把事件以 标准告警事件 格式推送给 Flashduty 即可:onbattery 触发告警,offbattery 恢复告警。
在 Flashduty On-call
您可通过以下两种方式获取集成推送地址,任选其一即可。集成类型都选择 标准告警事件,不是 apcupsd。
使用专属集成
- 进入 Flashduty 控制台,选择 协作空间,打开一个协作空间
- 选择 配置 → 集成数据 → 专属集成,点击 新增一个集成
- 选择 标准告警事件,点击 保存
- 打开生成的集成卡片,复制 推送地址,形如
https://api.flashcat.cloud/event/push/alert/standard?integration_key=<集成密钥>
使用共享集成
- 进入 Flashduty 控制台,选择 集成中心 → 告警事件
- 选择 标准告警事件,填写集成名称
- 配置默认路由并选择协作空间;创建后可在 路由 中增加更多规则
- 点击 保存,复制生成的 推送地址
在 apcupsd 中配置
步骤 1:创建推送脚本
在运行apcupsd 的主机上创建 /etc/apcupsd/flashduty-notify.sh,把 URL 换成上一步复制的推送地址,并设置为可执行(chmod +x)。该主机需要安装 curl。
步骤 2:为事件挂接脚本
apcupsd 的定制方式(见apccontrol 手册):在 /etc/apcupsd 目录创建与事件同名的可执行文件,事件发生时 apccontrol 会先执行它,脚本以退出码 0 结束时,apccontrol 继续执行该事件的默认动作;以退出码 99 结束则跳过默认动作。上面的脚本始终以 0 退出,不会改变 apcupsd 的默认行为(包括关机流程)。
下面的命令为每个事件创建一个只调用推送脚本的事件文件;目录里已经存在同名文件的事件(apcupsd 默认安装的 onbattery、offbattery、commfailure、commok、changeme 示例脚本就是这种情况)不会被覆盖,命令会提示你手动在文件开头附近加一行调用:
powerout(UPS 一切换到电池就触发)没有挂接:onbattery 只在停电持续超过 ONBATTERYDELAY 后触发,可以避免市电瞬断产生告警。
步骤 3:验证
在主机上手动运行事件脚本,先触发再恢复:UPS myups: on battery,随后被恢复。手动运行 onbattery 会同时执行该事件文件里已有的其他内容;只想测试推送时,直接运行 /etc/apcupsd/flashduty-notify.sh onbattery myups。
恢复与去重
onbattery、失效类事件(failing、timeout、loadlimit、runlimit)与offbattery、mainsback共用 Alert Keyapcupsd:<UPS 名称>:power:onbattery触发告警,随后的失效类事件把它升级为 Critical,市电恢复时被恢复commfailure与commok、battdetach与battattach各自成对changeme和emergency没有对应的恢复事件。apcupsd 在电池故障持续期间每 9 小时重复发送changeme。更换电池后请在 Flashduty 手动关闭告警,或在协作空间开启 超时自动关闭,建议时长 24 小时;电池仍未更换时,下一次changeme会重新触发告警- 多台 UPS 的告警互不影响:Alert Key 中带有 UPS 名称(
apcupsd.conf中配置的名称)
排查问题
- 没有收到告警:确认
/etc/apcupsd下与事件同名的文件存在且可执行,flashduty-notify.sh中的URL正确;手动运行事件文件检查输出 - 告警没有恢复:确认恢复事件(
offbattery、mainsback、commok、battattach)也挂接了脚本 - Flashduty 返回参数错误:确认
URL是完整的推送地址,包含integration_key