一、为什么需要邮件告警

虽然网页上能直接看到触发器告警,但平时不能一直看网页,所以触发器触发后我们要发送邮件、微信、钉钉等通知我们。

触发器触发后,可以配置对应的动作,在动作里可以发邮件、微信、钉钉、短信等。

邮件告警之前的流程
1、添加主机组
2、添加主机或模板
3、为主机监控项目或者为模板添加监控项目后绑定主机
4、根据监控项目可添加触发器,监控项达到触发条件后产生告警

邮件告警流程
1、编写用来发送邮件的脚本(zabbix_sendmail.py)
2、创建一个使用这个脚本(zabbix_sendmail.py)的报警媒介(例如python mail)
3、选择用户(例如admin),为用户添加报警媒介(例如python mail)
4、创建事件源为触发器(注释1)的动作,可以选定条件针对某个触发器(例如port error 22)或某个模板里的触发器或某个主机的触发器等条件,并且在动作里设置消息标题及消息内容,以及动作操作时要发送的用户和使用的报警媒介。

这样在某个触发器或模板或其他条件发生告警后,会执行与其相关的动作,根据动作里设置的消息标题和内容,将告警信息根据报警媒介发送给用户。

注释1:触发器事件源也可以为自动发现自动注册等,这里只看到了事件源为触发器的,先记一下

py脚本接收zabbix报错日志 zabbix调用python脚本_python

本文中的过程

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服务,并生成授权码

py脚本接收zabbix报错日志 zabbix调用python脚本_py脚本接收zabbix报错日志_02


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%"

py脚本接收zabbix报错日志 zabbix调用python脚本_py脚本接收zabbix报错日志_03

5、创建报警媒介类型

在(管理–报警媒介类型)里可以看有几种默认的报警媒介,这些都用不上,可以禁用掉。

py脚本接收zabbix报错日志 zabbix调用python脚本_py脚本接收zabbix报错日志_04

在左上角自己选择创建报警媒介的类型
名称: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

py脚本接收zabbix报错日志 zabbix调用python脚本_发送邮件_05

6、使用上面创建的python mail这个报警媒介类型为用户添加报警媒介

在(管理–用户-报警媒介)里添加,这里直接选择admin用户

py脚本接收zabbix报错日志 zabbix调用python脚本_py脚本接收zabbix报错日志_06


为用户设置报警媒介,类型为上面创建的python mail,并设置收件人,这里会将收件人传给类型中的{ALERT.SENDTO}这个参数

py脚本接收zabbix报错日志 zabbix调用python脚本_发送邮件_07


添加后再更新一下用户才能生效

py脚本接收zabbix报错日志 zabbix调用python脚本_触发器_08

7、创建动作

邮件主题定义 -> {ALERT.SUBJECT}
邮件内容定义 -> {ALERT.MESSAGE}
操作添加发送邮件告警
恢复添加发送邮件告警

在(配置–动作)里针对触发器创建动作

py脚本接收zabbix报错日志 zabbix调用python脚本_发送邮件_09

动作名称设为 send mail by python

动作可以有多种事件源,可以选择主机、主机群组、应用集、模板、触发器等等

py脚本接收zabbix报错日志 zabbix调用python脚本_触发器_10


这里我选择触发器,使用之前创建的自定义模板Template check port 里的 port 22 error 这个触发器,然后选择后添加

py脚本接收zabbix报错日志 zabbix调用python脚本_发送邮件_11


py脚本接收zabbix报错日志 zabbix调用python脚本_py脚本接收zabbix报错日志_12


设置操作然后点添加,这里需要设置发送的用户以及使用的报警媒介

py脚本接收zabbix报错日志 zabbix调用python脚本_发送邮件_13


设置恢复时的操作然后点添加,notify all involved表示将恢复消息发送给之前故障时发送的那些接收方

py脚本接收zabbix报错日志 zabbix调用python脚本_触发器_14


最后点添加或更新一下动作

  • 20210512补充:
    如果是在zabbix5.0以上的版本,告警信息模板的定义放到告警媒介里去了,不在动作里设置了

8、关掉一台之前有配置这个模板里触发器的的www_002机器,然后可以收到邮件

py脚本接收zabbix报错日志 zabbix调用python脚本_python_15


py脚本接收zabbix报错日志 zabbix调用python脚本_触发器_16


9、再将机器开起来也可以收到恢复邮件

py脚本接收zabbix报错日志 zabbix调用python脚本_python_17


py脚本接收zabbix报错日志 zabbix调用python脚本_触发器_18

三、告警内容自定义

主题、内容定义

  1. 主机名变量:{HOST.NAME1}
  2. 主机IP变量:{HOST.IP1}

这里在动作的操作和恢复操作的标题里加上主机名称和主机ip

py脚本接收zabbix报错日志 zabbix调用python脚本_触发器_19


然后触发一下动作,可以看到收到的邮件标题有主机名称和ip

py脚本接收zabbix报错日志 zabbix调用python脚本_python_20


这里也可以自定义修改消息的内容

四、告警抑制

  • 一般来说不会有问题马上发送告警,例如检测80端口
  • 定义持续时间
  • 定义step
    1、设置动作里的操作

2、一个步骤设置60s,设置在第三次操作步骤的时候发送,即告警至少持续两分钟才发送

py脚本接收zabbix报错日志 zabbix调用python脚本_发送邮件_21


然后触发一下触发器,当持续时间超过2分钟才会执行动作发送邮件

py脚本接收zabbix报错日志 zabbix调用python脚本_py脚本接收zabbix报错日志_22


超过两分钟后可以收到邮件

py脚本接收zabbix报错日志 zabbix调用python脚本_发送邮件_23