背景
最近部署了一套zabbix监控平台,甲方有短信平台需要我们调通接口,把告警通过短信的形式发出来。在向平台申请完账号,要到接口文档就开始配置联调了!
步骤
查看告警脚本文件路径
放开zabbix_server.conf配置文件中的如下配置:
AlertScriptsPath=${datadir}/zabbix/alertscripts
其中datadir
目录是在二进制编译时候的设置的,如果忘记这里可以使用绝对路径,写死到指定目录。
编写脚本
在指定了告警脚本目录后,我们需要将我们的告警脚本放到上述的告警路径下,方便后续调用,zabbix可以找得到脚本文件。这里我的告警脚本分为两部分zabbix_alert.sh
和sendSms.py
。
- zabbix_alert.sh:接收zabbix告警传参,重新编码后传递给实际调用短信接口的python脚本。
#!/bin/bash
# 接收告警内容,重定向到itemvalue文件方便后续转码,防止乱码。注意这里目录需要改成自己的,目录权限也要给足
echo "$3" > /usr/local/etc/zabbix/alertscripts/itemvalue
# 接收到的utf-8中文内容转码成虚拟机编码:GB2312
tmp=$(/usr/bin/iconv -c -f UTF8 -t "GB2312//TRANSLIT" /usr/local/etc/zabbix/alertscripts/itemvalue)
# 将sendTo、subject、message传递到python脚本。我这只关心告警信息则只对告警信息进行了转码
/usr/bin/python3 /usr/local/etc/zabbix/alertscripts/sendSms.py "$1" "$2" "$tmp"
- sendSms.py:接收zabbix.sh脚本传来的参数,调用第三方短信接口发送告警。
# -*- coding: utf-8 -*-
import time
import math
import hashlib
import requests
import json
import sys
def getSecret():
pass
# 告警函数,代码逻辑已省略,根据自己情况进行编写
def sendMessage(requestSecret="", content="测试短信", phones=["18574700627"]):
pass
if __name__ == '__main__':
# 上述zabbix_alert.sh的"$1"
sendto = sys.argv[1]
# 上述zabbix_alert.sh的"$2"
subject = sys.argv[2]
# 上述zabbix_alert.sh的"$tmp"
message = sys.argv[3]
# 获取短信接口秘钥
requestSecret = getSecret()
# 发送短信
sendMessage(requestSecret = requestSecret, content = message)
因为短信接口,不同平台接口鉴权方式不一样,sendSms.py
我这里给出部分代码。使用python2的小伙伴注意加上以下代码谨防中文乱码:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
在上述两个脚本编写完毕后我们就可以执行脚本调试了。即进入zabbix告警脚本目录下,执行脚本:
./zabbix_alert.sh 11111111111 测试 这是一条测试短信
执行完上述命令后,如若python脚本编写无误,就可以收到一条发给到11111111111号码的主题为“测试”,内容为"这是一条测试短信"的信息。大家可以根据脚本执行后终端输出信息调试自己的脚本。
新建告警媒介
在准备好告警脚本之后我们需要把上述脚本和短信告警媒介进行关联。我这里不用官方默认的短信告警媒介,自己新建如下图所示:
注意这里的脚本名称需要和上面zabbix_alert.sh
名称完全一致!脚本参数使用的是三个宏变量:
- {ALERT.SENDTO}:告警短信接收方。
- {ALERT.SUBJECT}:告警短信主题。
- {ALERT.MESSAGE}:告警短信消息内容。
新建用户
新建告警用户,用于确认告警消息接收对象,我们这边直接使用Admin对象,就不再新建。
配置告警媒介如下:
方便调试我这里是把所有类型的告警都通过send_sms
告警媒介类型进行发送,在正式生产环境中一般达到严重和灾难级别的告警才发送短信到运维人员。
新建动作
在完成新建用户、脚本编写、新建告警媒介类型后我们就可以进行短信告警所需要配置的最后一个步骤了:新建动作。这个步骤zabbix不同版本可能页面布局不一样,但是配置内容都是没变的,我这里使用的是Zabbix 5.0.1。
配置->动作 ->创建动作:
输入任意名称:
配置操作:
这里默认操作步骤持续时间配置成60s、操作、恢复操作、更新操作都惊醒相同配置。这里的三个操作的对象指的是告警,也就是zabbix里面的“问题”,我这里将三个操作都配置上,表示我在对告警进行恢复、更新等其他操作都会触发此动作。我这里给出我配置“操作”的样例截图:
其中主题和消息内容贴出如下:
主题:
Problem:{TRIGGER.NAME}
消息:
"host":"{HOST.NAME}"
"time":"{EVENT.DATE} {EVENT.TIME}"
"alert_degree":"{TRIGGER.SEVERITY}"
"alert_massage": "{HOST.NAME}:{TRIGGER.NAME}"
"alert_project":"{TRIGGER.KEY1}"
"details":"{ITEM.NAME}:{ITEM.VALUE}"
"current_state":"{TRIGGER.STATUS}:{ITEM.VALUE1}"
"description":"{TRIGGER.DESCRIPTION}"
"event_ID":"{EVENT.ID}"
自此我们告警配置步骤就全部完成了。下面进入调试阶段。
调试
管理->告警媒介类型。选中前面新建的告警媒介点击测试,输入收件人、主题、消息即可进行调试。
此处调试日志在zabbix_server.log文件中可进行查看。如果脚本编写无误到此zabbix配置短信告警就成功了!信息中文乱码情况,可返回到本篇的“编写脚本”阶段,参考zabbix_alert.sh
脚本中使用iconv
处理乱码的方式或可解决你的问题。