zabbix 监控其它服务器的磁盘空间发送钉钉报警信息
文章来源于:感谢大佬的分享
https://blog.csdn.net/yulaoer53/article/details/118960381
https://blog.csdn.net/lizhecsdn/article/details/124931385
系统 centos7
ip | 操作系统 | 角色 |
---|---|---|
192.168.0.199 | centos7 | 监控端 |
192.168.0.200 | centos7 | 被监控端 |
被监控端
rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
yum install zabbix-agent
修改配置文件
vim /etc/zabbix/zabbix_agentd.conf
117 Server=192.168.0.199 # 监控端 IP
启动客户端
systemctl start zabbix-agent
systemctl status zabbix-agent
监控端
创建主机
添加监控项
键值:vfs.fs.size[/data,pfree]
创建触发器
表达式: {200:vfs.fs.size[/data,pfree].last()}=20
配置 zabbix 发送告警到钉钉
先去钉钉上获取 [webhook 地址 和 app_secret]
打开一个想要将预警消息推送到的钉钉群
群设置 -> 智能群助手 -> 添加机器人 -> 选择自定义机器人
编写 DingDingWarn.py
#!/bin/python3
# -*- coding:utf-8 -*-
import base64
import hashlib
import hmac
import json
import sys
import time
import urllib
import requests
"""
zabbix 警告消息通过 webhook 方式发送到钉钉机器人
"""
class DingDingWarn:
headers = {'Content-Type': 'application/json; charset=utf-8'}
# 从钉钉群机器人配置上获取的 webhook 地址和加签
url = 'url'
secret = 'app_secret'
#linux 日志路径 (自己定义的)
log_path1 = r'/usr/lib/zabbix/alertscripts/dingdingmsg.log'
def __init__(self, alert_subject, alert_message):
'''
初始化发送的钉钉消息
:param alert_subject: 警告消息描述
:param alert_message: 警告消息内容
'''
self.alert_subject = alert_subject
self.alert_message = alert_message
def build_request_url(self):
timestamp = str(round(time.time() * 1000))
secret = self.secret
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
return f'{self.url}×tamp={timestamp}&sign={sign}'
def build_body(self):
'''
构建请求体
:return:
'''
return {
"msgtype": "text",
"text": {"content": f" 告警描述:\n{self.alert_subject}\n\n 告警内容:\n{self.alert_message.strip()}"
}
}
def send_msg(self):
'''
发送警告消息
:return:
'''
print(self.build_request_url())
response = requests.post(url=self.build_request_url(), data=json.dumps(self.build_body()), headers=self.headers)
body = response.text
print(body)
if eval(body)['errmsg'] == 'ok':
status = 'send success!'
else:
status = 'send error!'
self.save_log(status)
def save_log(self, status):
'''
保存日志
:param status: 发送状态
:return:
'''
f = open(file=self.log_path1, mode='a')
f.write(f'''
{status.center(25, '-')}
告警描述:
{self.alert_subject}
告警内容:
{self.alert_message}
{'End'.center(30, '-')}
''')
f.close()
if __name__ == '__main__':
# 获取执行参数
alert_subject = sys.argv[1]
alert_message = sys.argv[2].replace('\r\n', '\n')
# 将接受到的消息参数, 输出到日志文件
# a = open("r'/usr/lib/zabbix/alertscripts/dingdingparam.log'", mode='a')
# a.write(alert_subject + '---' + alert_message)
# 发送警告消息
d = DingDingWarn(alert_subject, alert_message)
# print(' 可执行 ')
d.send_msg()
将脚本文件放到 /usr/lib/zabbix/alertscripts/ 下
配置报警媒介
主题:
{HOST.NAME} 告警信息:{TRIGGER.NAME}
消息:
告警主机:{HOST.NAME}
告警地址:{HOST.IP}
监控项目:{ITEM.NAME}
告警信息:{TRIGGER.NAME}
当前状态:{TRIGGER.STATUS}
监控取值:{ITEM.LASTVALUE}
告警时间:{EVENT.DATE} {EVENT.TIME}
恢复时间:{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
持续时间:{EVENT.AGE}
事件 ID:{EVENT.ID}
告警等级:{TRIGGER.SEVERITY}
设置触发动作
主题:
出现问题!! {HOST.NAME} 监控信息:{TRIGGER.NAME}
消息:
告警主机:{HOST.NAME}
告警地址:{HOST.IP}
监控项目:{ITEM.NAME}
告警信息:{TRIGGER.NAME}
当前状态:{TRIGGER.STATUS}
监控取值:{ITEM.LASTVALUE}
告警时间:{EVENT.DATE} {EVENT.TIME}
恢复时间:{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
持续时间:{EVENT.AGE}
事件 ID:{EVENT.ID}
告警等级:{TRIGGER.SEVERITY}
正文完