upsmon 在 UPS 状态变化时可以执行 NOTIFYCMD 指定的脚本,环境变量 NOTIFYTYPE 是事件类型(ONBATT、ONLINE、COMMBAD 等),UPSNAME 是 UPS 名称,通知文本作为脚本的最后一个参数。NUT 没有原生的 Webhook,用一个几行的脚本把这些事件以 标准告警事件 格式推送给 Flashduty 即可:ONBATT 触发告警,ONLINE 恢复告警。
在 Flashduty On-call
您可通过以下两种方式获取集成推送地址,任选其一即可。集成类型都选择 标准告警事件,不是 NUT。
使用专属集成
- 进入 Flashduty 控制台,选择 协作空间,打开一个协作空间
- 选择 配置 → 集成数据 → 专属集成,点击 新增一个集成
- 选择 标准告警事件,点击 保存
- 打开生成的集成卡片,复制 推送地址,形如
https://api.flashcat.cloud/event/push/alert/standard?integration_key=<集成密钥>
使用共享集成
- 进入 Flashduty 控制台,选择 集成中心 → 告警事件
- 选择 标准告警事件,填写集成名称
- 配置默认路由并选择协作空间;创建后可在 路由 中增加更多规则
- 点击 保存,复制生成的 推送地址
在 NUT 中配置
步骤 1:创建通知脚本
在运行upsmon 的主机上创建脚本,例如 /usr/local/bin/nut-flashduty.sh,把 URL 换成上一步复制的推送地址,并设置为可执行(chmod +x)。该主机需要安装 curl。
步骤 2:在 upsmon.conf 中启用脚本
编辑upsmon.conf,指定通知脚本,并为要推送的事件类型加上 EXEC 标志(NOTIFYCMD 只对设置了 EXEC 的事件执行):
NOTIFYCMD 的第一个值按脚本的完整路径解析,路径含空格时需要加引号(NUT 2.8.5 及更早版本的解析方式不同,详见 NUT 文档 upsmon.conf)。ALARM、OVER、BYPASS 等类型需要推送时,按同样的写法为它们和对应的恢复类型(NOTALARM、NOTOVER、NOTBYPASS)添加 NOTIFYFLAG。修改后让 upsmon 重新读取配置:
NUT 的
upsmon 在后台运行 NOTIFYCMD,同时发生多个事件时脚本会并行执行多个实例,上面的脚本每次调用只发送一次请求,可以并行运行。关机相关的事件类型(FSD、SHUTDOWN 等)不在脚本的处理范围内,脚本收到后直接退出。步骤 3:验证
在主机上手动运行脚本,先触发再恢复:UPS ups@localhost: on battery,随后被恢复。
恢复与去重
ONBATT、LOWBATT、ONLINE共用 Alert Keynut:<UPS 名称>:power:ONBATT触发告警,随后的LOWBATT把它升级为 Critical,ONLINE恢复它COMMBAD、NOCOMM与COMMOK共用comm;ALARM与NOTALARM、OVER与NOTOVER、BYPASS与NOTBYPASS也各自成对REPLBATT没有对应的恢复事件,更换电池后请在 Flashduty 手动关闭告警,或在协作空间开启 超时自动关闭,建议时长 7 天- 多台 UPS 的告警互不影响:Alert Key 中带有
UPSNAME
排查问题
- 没有收到告警:确认
upsmon.conf中对应事件类型的NOTIFYFLAG含有EXEC,且已执行upsmon -c reload - 脚本手动运行成功,但 upsmon 触发时没有告警:
NOTIFYCMD必须是脚本的完整路径,且upsmon的运行用户能执行它;失败原因由curl -fsS打印到 stderr,upsmon不一定记录,排查时手动运行脚本查看 - 告警没有恢复:确认
ONLINE等恢复类型也设置了EXEC - Flashduty 返回参数错误:确认
URL是完整的推送地址,包含integration_key