Zabbix,Nagios 等监控软件在运维方面越来越受青睐,因为能够准时,及时的将服务器产生的故障信息,发送给运维人员,以便运维人员能够及时的解决问题。但是近来,越来越多的公司就偏向了的 zabbix 阵营,当然选择这东西,因人而异。
zabbix 的部署可参考 前面 zabbix3.4.4 源码安装部署zabbix_server
编者在学习了 Python 一段时间后,发现 Zabbix Api 可以利用脚本的形式实现 Zabbix 自动监控,所以编者在兴趣驱使下,在查阅了相关的资料后,就开始使用自己的云服务器进行实验。
所以本文介绍的就是如何使用 Python,Zabbix Api,钉钉机器人,来实现自动化监控。
既然是钉钉机器人,那么在开始实现的 zabbix 自动化监控之前,肯定是先有钉钉添加机器人才能实现。
到这里,钉钉机器人已经创建成功,在这里需要着重强调是,一定要将网络的api接口保存。在编写脚本时,需要用到接口信息。
接下来就是编写的钉钉机器人脚本,需要注意的是,脚本需要放在 zabbix 的 alertscripts 目录下(如果不知道该目录的位置,可以使用 find 命令查找 find / -iname alertscripts
,脚本具体内容附下文:
[[email protected] ] find /-iname "alertscripts"
#!/usr/bin/python
# -*- conding:utf8-*-
# Author Scong
import requests
import json
import sys
import os
url = "https://oapi.dingtalk.com/robot/send?access_token=xxxxxx" # 这里的url就是webhook的Api接口
headers = {'Content-Type': 'application/json;charset=utf-8'} # 头部信息,Zabbix官方文档写法,可以查看zabbix官方文档
def message(text): # 定义信息函数
text_info= { # 编写规则可以查看Zabbix官方文档的Zabbix Api
"msgtype": "text",
"at": {
"atMobiles": [
"132xxxxx672"
],
"isAtAll": False
},
"text": {
"content": text
}
}
print requests.post(url,json.dumps(text_info),headers=headers).content # 将返回的数据编码成 JSON 字符串
if __name__ == '__main__': # 调用message函数
text = sys.argv[1]
message(text)
如果想知道自己的脚本是否可用,可以在命令行下(针对 Linux 操作系统),输入python dingding.py 123
,如果你在钉钉上收到了信息,则说明该脚本可用。
在上述步骤都完成后,进入到已经部署好的 ZABBIX 服务器上,进行一些简单的设置,等设置好之后,就可以实现自动化监控了。
4、由于需要 ZABBIX 管理用户才有一定的执行权限,所以这里需要绑定用户:
5、在发生警报的时候,ZABBIX 需要有执行的动作,所以需要创建动作:
好了,到这里,可以说已经完成了 95% 了,还有 5% 就是测试。由于编者使用的是阿里云的云服务器,是没有交换(交换空间)的,所以编者就修改了相对应的数值,测试在发生故障的时候,钉钉机器人是否有将故障信息发到编者的钉钉上。果然,上述在步骤无误的部署下,成功编者的实现了钉钉机器人脚本实现的 zabbix 自动化监控。
如图,修复后,钉钉机器人发送的已修复信息:
修复后的问题,返回的信息当前状态会变成确定
附:
操作故障信息:
服务器:{HOST.NAME}发生: {TRIGGER.NAME}故障!
{
报警主机:{HOST.NAME}
主机地址:{HOST.IP}
监控项目:{ITEM.NAME}
监控取值:{ITEM.LASTVALUE}
报警等级:{TRIGGER.SEVERITY}
当前状态:{TRIGGER.STATUS}
报警信息:{TRIGGER.NAME}
报警时间:{EVENT.DATE} {EVENT.TIME}
事件ID:{EVENT.ID}
}
恢复操作默认信息:
服务器:{HOST.NAME}: {TRIGGER.NAME}已恢复!
{
报警主机:{HOST.NAME}
主机地址:{HOST.IP}
监控项目:{ITEM.NAME}
监控取值:{ITEM.LASTVALUE}
报警等级:{TRIGGER.SEVERITY}
当前状态:{TRIGGER.STATUS}
报警信息:{TRIGGER.NAME}
报警时间:{EVENT.DATE} {EVENT.TIME}
恢复时间:{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
持续时间:{EVENT.AGE}
事件ID:{EVENT.ID}
}
确认操作默认信息:
服务器:{HOST.NAME}: 报警确认
{
执行人:{USER.FULLNAME}
时间:{ACK.DATE} {ACK.TIME}
确认信息如下:
“{ACK.MESSAGE}”
问题服务器IP:{HOSTNAME1}
问题ID:{EVENT.ID}
当前的问题是: {TRIGGER.NAME}
}