一、场景模拟
小刘是某国内知名IT企业的运维工程师。他们公司使用zabbix监控设备性能情况。但是最近他们公司的网络设备需要进行升级替换,导致经常出现大量的邮件告警,对此小刘感到很头痛,下面就由我们用一分钟来告诉他怎么解决这个问题吧。
环境说明:
zabbix版本:Zabbix6.0
操作系统:centos7.9
开发语言:python3
注意:本文档主要讲解实现思路及配置方法,具体邮件发送方式可自行编写对应的脚本
编写一个python脚本,用于邮件发送,及统计邮件发送的次数。然后通过定时任务crontab+最大发送的条数配置文件、当前发送的条数配置文件,实现zabbix告警抑制
告警脚本存于zabbix_server的这个路径,具体路径可查看zabbix_server.conf文件。
脚本命名alerts_limit.py、脚本内容如下
#!/usr/bin/env python3
#_*_ coding:utf-8 _*_
#导入python库
import sys
import os.path
#发送邮件
"""
参数1:发送人邮箱
参数2:邮件标题
参数3:邮件内容
"""
def sendemail(senduser,sendtitle,sendcontent):
with open('/tmp/sendhistory.log','a',encoding='utf-8') as f:
f.write('告警标题:{0},发信人:{1},告警内容:{2}\n'.format(senduser,sendtitle,sendcontent))
if __name__ == '__main__':
#当前发送的配置文件、最大的发送的告警条数
currentsend_path = '/tmp/currentsend.conf'
maxsend_path = '/tmp/maxsend.conf'
#发件人,发件标题,发件内容
senduser = sys.argv[1]
sendtitle = sys.argv[2]
sendcontent = sys.argv[3]
#获取当前发送的告警条数,默认值0
if os.path.exists(currentsend_path):
with open(currentsend_path,'r',encoding='utf-8') as f:
currentsend_num = int(f.read().strip())
currentsend_num+=1
#发一次就加一次
with open(currentsend_path,'w',encoding='utf-8') as f:
f.write(str(currentsend_num))
else:
with open(currentsend_path,'w',encoding='utf-8') as f:
f.write('0')
currentsend_num=0
#获取最大的发送的告警条数,默认值50
if os.path.exists(maxsend_path):
with open(maxsend_path,'r',encoding='utf-8') as f:
maxsend_num = int(f.read().strip())
else:
with open(currentsend_path,'w',encoding='utf-8') as f:
f.write('100')
currentsend_num=100
#判断是否超过发送邮件的次数
if currentsend_num < maxsend_num:
#发送邮件
sendemail(senduser,sendtitle,sendcontent)
elif currentsend_num == maxsend_num:
sendemail(senduser,'告警超过限制的发送条数','当前告警发送邮件已停止,请登录zabbix查看具体告警')
上述脚本存在一个问题,如果用户不手动删除/tmp/currentsend.conf这个文件或者把/tmp/currentsend.conf。那么zabbix产生的告警将会不发送邮件通知。如果要实现比如告警发送自动恢复的话,只需要添加定时任务即可。举例说明
比如我要5分钟内,邮件告警不能超过50条
那么只需要,定时任务添加,并把/tmp/maxsend.conf修改成50即可
*/5 * * * * echo ‘0’ >/tmp/maxsend.conf
比如我要1分钟内,如果邮件告警不能超过30条
那么只需要,定时任务添加,并把/tmp/maxsend.conf修改成30即可
* * * * * echo ‘0’ >/tmp/maxsend.conf
为了方便演示,我们使用采集器监控项进行模拟告警
注意:maxsend.conf、currentsend.conf、alerts_limit.py都必须为zabbix_server的服务用户创建,否则可能出现权限问题,导致无法限制
告警超过限制10条通知后,告警不会自动恢复发送邮件通知,需人工手动操作
修改/tmp/maxsend.conf文件里面的值为10
如下图,我们模拟了产生了超过10个告警。产生16个告警。
验证我们的sendmail的调用次数。查看/tmp/sendhistory查看邮件发送的记录。正常来说,currentsend.conf应该为16当前告警数。然后/tmp/sendhistory应该只有9条告警内容和1条告警限制的通知
符合预期效果
进一步验证
我再产生多16条告警。再查看/tmp/sendhistory是否还是只有10条发邮件的调用历史,同时/tmp/currentsend.conf的数应为32
如下图,没有调用发送邮件的动作
如果我这时候,我再把/tmp/currentsend.conf的值该为0,则正常情况产生16个告警数后,/tmp/currentsend.conf为16,而/tmp/sendhistory.log应该有20条通知
符合实际需求
配置定时任务1分钟不能超过10条邮件通知
修改/tmp/maxsend.conf为10
配置定时任务,每分钟把当前告警数设置为0
验证效果
如下图,1分钟内。当前告警数持续增加。而邮件发送通知数,始终只是10条记录
到了下一分钟后,告警通知次数为20。当前告警数为重新计算
验证效果:如果限制邮件通知成功,当前告警平台告警数应为64个,而邮件通知记录个数应该为20。因为一分钟限制发送邮件次数为10条。两分钟内,产生了64个告警,但是发送邮件历史为20
注意:如果刚好是每分钟58-59秒产生的大量告警,可能会出现发送邮件超过每分钟10条这个限制(可能会多几条告警)
错误信息