一、为什么需要邮件告警
虽然网页上能直接看到触发器告警,但平时不能一直看网页,所以触发器触发后我们要发送邮件、微信、钉钉等通知我们。
触发器触发后,可以配置对应的动作,在动作里可以发邮件、微信、钉钉、短信等。
邮件告警之前的流程
1、添加主机组
2、添加主机或模板
3、为主机监控项目或者为模板添加监控项目后绑定主机
4、根据监控项目可添加触发器,监控项达到触发条件后产生告警
邮件告警流程
1、编写用来发送邮件的脚本(zabbix_sendmail.py)
2、创建一个使用这个脚本(zabbix_sendmail.py)的报警媒介(例如python mail)
3、选择用户(例如admin),为用户添加报警媒介(例如python mail)
4、创建事件源为触发器(注释1)的动作,可以选定条件针对某个触发器(例如port error 22)或某个模板里的触发器或某个主机的触发器等条件,并且在动作里设置消息标题及消息内容,以及动作操作时要发送的用户和使用的报警媒介。
这样在某个触发器或模板或其他条件发生告警后,会执行与其相关的动作,根据动作里设置的消息标题和内容,将告警信息根据报警媒介发送给用户。
注释1:触发器事件源也可以为自动发现自动注册等,这里只看到了事件源为触发器的,先记一下
本文中的过程
1、编写一个发送邮件的脚本(zabbix_sendmail.py),获取传入参数(接收人、标题、消息等)
2、配置一个报警媒介类型(python mail),使用上面写的脚本,并配置脚本参数
3、使用上面创建的python mail这个报警媒介类型为用户添加报警媒介
4、创建动作(send mail by python),这里针对触发器来创建动作,当触发器触发时执行动作。设置动作执行时及恢复时的操作,这里需要设置发送的用户以及使用的该用户配置的报报警媒介
二、如何配置邮件告警
1、告警脚本放置位置
这里使用的是python脚本的方式,告警脚本的放置位置见zabbix的配置里
/usr/local/zabbix/etc/zabbix_server.conf
[root@localhost ~]# cat /usr/local/zabbix/etc/zabbix_server.conf
ListenPort=10051
LogFile=/usr/local/zabbix/zabbix_server.log
PidFile=/usr/local/zabbix/zabbix_server.pid
DBHost=127.0.0.1
DBName=zabbix
DBUser=zabbix
DBPassword=123456
DBPort=3306
Timeout=30
#告警脚本位置
AlertScriptsPath=/usr/local/zabbix/alertscripts
ExternalScripts=/usr/local/zabbix/externalscripts
LogSlowQueries=3000
2、邮件告警注意事项
- 服务器往外的25端口一般被云厂商禁止
- 所以建议使用465端口发送邮件
- qq邮箱、163邮箱需要配置开启smtp
3、开启QQ邮件smtp并生成授权码
在QQ邮箱的设置-》帐户页面找到入口,开启前两个smtp服务,并生成授权码
4、使用python脚本发送邮件
vim /usr/local/zabbix/alertscripts/zabbix_sendmail.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
from email.mime.text import MIMEText
from email.header import Header
from smtplib import SMTP_SSL
import sys
smtpaddr = 'smtp.qq.com'
myemail='838319771@qq.com'
password='mypassword' #这里使用上面生成的授权码
recvmail=sys.argv[1] #接收方邮箱
subject=sys.argv[2] #邮件标题
content=sys.argv[3] #邮件内容
msg = MIMEText("""%s"""%(content), "plain", "utf-8")
msg['Subject'] = Header(subject, 'utf-8').encode()
msg['From'] = myemail #发送方邮箱
msg['To'] = recvmail #接收方邮箱
try:
smtp = SMTP_SSL( smtpaddr ) #创建smtp对象,地址为qq的smtp地址
smtp.login(myemail, password) #使用账号和授权码登陆
smtp.sendmail(myemail, recvmail.split(','), msg.as_string()) #发送邮件
smtp.quit() #退出
print("success")
except Exception as e:
print("fail: "+str(e))
执行一下脚本进行测试,可以收到上面的邮箱里发来的邮件
chown -R zabbix:zabbix /usr/local/zabbix/
chmod +x /usr/local/zabbix/alertscripts/zabbix_sendmail.py
python zabbix_sendmail.py 1094386858@qq.com "zabbixdisk" "content: disk > 90%"
5、创建报警媒介类型
在(管理–报警媒介类型)里可以看有几种默认的报警媒介,这些都用不上,可以禁用掉。
在左上角自己选择创建报警媒介的类型
名称:python mail
类型:脚本
脚本名称:zabbix_sendmail.py (即上面创建的脚本名称,会自动到配置的目录下找这个脚本)
脚本参数:与zabbix_sendmail.py脚本需要的3个参数对应
- {ALERT.SENDTO} #接收方,使用的是在user中用户的联系方式,可以是电话号码、Email-address等
- {ALERT.SUBJECT} #邮件标题,使用的是在action中的subject主题
- {ALERT.MESSAGE} #邮件内容,使用的是在action中的message信息,包含operation和recovery operation
6、使用上面创建的python mail这个报警媒介类型为用户添加报警媒介
在(管理–用户-报警媒介)里添加,这里直接选择admin用户
为用户设置报警媒介,类型为上面创建的python mail,并设置收件人,这里会将收件人传给类型中的{ALERT.SENDTO}这个参数
添加后再更新一下用户才能生效
7、创建动作
邮件主题定义 -> {ALERT.SUBJECT}
邮件内容定义 -> {ALERT.MESSAGE}
操作添加发送邮件告警
恢复添加发送邮件告警
在(配置–动作)里针对触发器创建动作
动作名称设为 send mail by python
动作可以有多种事件源,可以选择主机、主机群组、应用集、模板、触发器等等
这里我选择触发器,使用之前创建的自定义模板Template check port 里的 port 22 error 这个触发器,然后选择后添加
设置操作然后点添加,这里需要设置发送的用户以及使用的报警媒介
设置恢复时的操作然后点添加,notify all involved表示将恢复消息发送给之前故障时发送的那些接收方
最后点添加或更新一下动作
- 20210512补充:
如果是在zabbix5.0以上的版本,告警信息模板的定义放到告警媒介里去了,不在动作里设置了
8、关掉一台之前有配置这个模板里触发器的的www_002机器,然后可以收到邮件
9、再将机器开起来也可以收到恢复邮件
三、告警内容自定义
主题、内容定义
- 主机名变量:{HOST.NAME1}
- 主机IP变量:{HOST.IP1}
这里在动作的操作和恢复操作的标题里加上主机名称和主机ip
然后触发一下动作,可以看到收到的邮件标题有主机名称和ip
这里也可以自定义修改消息的内容
四、告警抑制
- 一般来说不会有问题马上发送告警,例如检测80端口
- 定义持续时间
- 定义step
1、设置动作里的操作
2、一个步骤设置60s,设置在第三次操作步骤的时候发送,即告警至少持续两分钟才发送
然后触发一下触发器,当持续时间超过2分钟才会执行动作发送邮件
超过两分钟后可以收到邮件