本节内容:

  • Zabbix的通知功能
  • 定义接收告警的用户
  • 定义Action
  • Zabbix自定义脚本发送报警邮件

 

一、Zabbix的通知功能

在配置好监控项和触发器之后,一旦正常工作中的某触发器状态发生改变,一般意味着有异常情况发生,此时通常需要采取一定的动作(action),如告警或者执行远程命令。 实现zabbix的通知功能,一般需要两个步骤:定义所需的“媒介”和配置一个”动作”。 媒介类型有:E-mail,SMS,Jabber和自定义的通知脚本。我这里就使用E-mail了。

1.定义媒介

登录zabbix web管理控制台,点击Administration—> Media types,可以看到有3个定义好了的媒介,不用这3个,点击右上角的”Create media type”。

zabbix 主动 脚本 zabbix自定义脚本告警_zabbix 主动 脚本

填写信息:

zabbix 主动 脚本 zabbix自定义脚本告警_sed_02

 

二、定义接收告警的用户

1.创建用户组

(1)点击Administration—> User groups,点击右上角的Create user group。

zabbix 主动 脚本 zabbix自定义脚本告警_zabbix 主动 脚本_03

(2)输入组名,点击Add。

zabbix 主动 脚本 zabbix自定义脚本告警_自定义_04

 

2.创建用户

(1)点击Administration—> Users,点击右上角的Create user。

zabbix 主动 脚本 zabbix自定义脚本告警_sed_05

在User列填入个人信息:

zabbix 主动 脚本 zabbix自定义脚本告警_zabbix 主动 脚本_06

(2)点击Media,点击Add,选择媒介和接收邮件的时间等信息:

zabbix 主动 脚本 zabbix自定义脚本告警_自定义_07

zabbix 主动 脚本 zabbix自定义脚本告警_自定义_08

(3)点击Permissions,根据这个新添的用户给予合适的权限

zabbix 主动 脚本 zabbix自定义脚本告警_sed_09

 

三、定义Action

点击Configuration—> Actions,点击右上角的Create action:

zabbix 主动 脚本 zabbix自定义脚本告警_sed_10

 

Action配置:

zabbix 主动 脚本 zabbix自定义脚本告警_sed_11

 

Conditions配置:

zabbix 主动 脚本 zabbix自定义脚本告警_发送邮件_12

zabbix 主动 脚本 zabbix自定义脚本告警_zabbix 主动 脚本_13

zabbix 主动 脚本 zabbix自定义脚本告警_自定义_14

 

四、Zabbix自定义脚本发送报警邮件

Zabbix发送报警邮件还可以采用自定义的脚本来发送。

1.Python脚本发邮件

(1)定义Media types

如下图,添加以下3个参数,分别对应sendEmail.sh脚本需要的3个参数:收件人地址、主题、详细内容。

{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}

zabbix 主动 脚本 zabbix自定义脚本告警_zabbix 主动 脚本_15

【注意】: 很多人安装zabbix 3.0之后,写的脚本一直发信不成功,手动执行时可以的。那是因为zabbix3.0之后,可以自定义参数了。所以不写参数,它是不会传参数的。在2.x版本不存在这个问题,默认会传3个参数。脚本中可以使用$1, $2, $3来调用 action 中的 邮件的收件人, Default Subject, Default Message。

 

(2)定义Users的Media

zabbix 主动 脚本 zabbix自定义脚本告警_自定义_16

 

(3)python报警脚本

# cd /usr/local/zabbix-3.0.1/share/zabbix/alertscripts/
# vim zabbix_sendmail.py

zabbix 主动 脚本 zabbix自定义脚本告警_sed_17

zabbix 主动 脚本 zabbix自定义脚本告警_sed_18

#!/usr/bin/python
# coding:utf-8 

import smtplib
from email.mime.text import MIMEText
import sys

# 邮箱服务器地址
mail_host = 'smtp.exmail.qq.com'
# 邮箱用户名
mail_user = '01115004@wisedu.com'
# 邮箱密码
mail_pass = 'zjk230640'
mail_postfix = 'wisedu.com'

def send_mail(to_list,subject,content):
    me = mail_user+"<"+mail_user+"@"+mail_postfix+">"
    msg = MIMEText(content)
    msg['Subject'] = subject
    msg['From'] = me
    msg['to'] = to_list

    try:
        s = smtplib.SMTP()
        s.connect(mail_host)
        s.login(mail_user,mail_pass)
        s.sendmail(me,to_list,msg.as_string())
        s.close()
        return True
    except Exception,e:
        print str(e)
        return False

if __name__ == "__main__":
    send_mail(sys.argv[1], sys.argv[2], sys.argv[3])

Python报警脚本

修改脚本权限:

# chmod +x zabbix_sendmail.py 
# chown -R zabbix.zabbix zabbix_sendmail.py

 

(4)修改zabbix_server配置

# vim /usr/local/zabbix-3.0.1/etc/zabbix_server.conf

添加如下配置:

### Option: AlertScriptsPath
AlertScriptsPath=/usr/local/zabbix-3.0.1/share/zabbix/alertscripts

重启zabbix_server。

 

(5)配置Actions

zabbix 主动 脚本 zabbix自定义脚本告警_sed_19

【注意】:每触发一次Action,都会在Reports—>Action log看到记录:

zabbix 主动 脚本 zabbix自定义脚本告警_sed_20

 

2.shell脚本发邮件

(1)先安装sendEmail

zabbix 主动 脚本 zabbix自定义脚本告警_sed_17

zabbix 主动 脚本 zabbix自定义脚本告警_sed_18

[root@care local]# tar zxf sendEmail-v1.56.tar.gz
[root@care local]# cp sendEmail-v1.56/sendEmail /usr/local/bin

安装sendEmail

将写好的脚本上传到/usr/local/zabbix-3.0.1/share/zabbix/alertscripts。这里为了业务需求,需要定制化发送邮件的内容,脚本内容如下:

zabbix 主动 脚本 zabbix自定义脚本告警_sed_17

zabbix 主动 脚本 zabbix自定义脚本告警_sed_18

#!/bin/bash
###Description:This script is used to alarm.
###Written by: jkzhao - jkzhao@wisedu.com  
###History: 2016-08-10 Second release.
###Modification: Please modify the variables host, user and passwd.

# 获取默认的邮件接收者,邮件主题,邮件正文
to=$1
subject=$2
bodyOrgin=$3

# 获取eventid
#eventid=grep "event ID" $bodyOrgin |awk '{print $4}'
eventid=$(echo $bodyOrgin | grep "event ID" |awk '{print $NF}')
echo "eventid:$eventid" > /tmp/test.txt

# shell调用存储过程,获取主键viewid,传入参数:eventid,输出:viewid
host=172.16.9.112
user=root
passwd=zabbix
database=zabbix

viewid=$(mysql -u${user} -p${passwd} -h${host} -D${database} -e "call generateAlertView($eventid,@result)" 2>/dev/null | awk 'NR>1')
echo "viewid:$viewid" >> /tmp/test.txt
group=$(mysql -u${user} -p${passwd} -h${host} -D${database} -e "select alerts_view_group.group from alerts_view_group where viewid = $viewid" 2>/dev/null | awk 'NR>1')
echo "group:$group" >> /tmp/test.txt
body=$bodyOrgin"; 影响业务: "$group


# 因为需要格式化发送邮件的内容,将拼接好的body信息写入文件中再做处理
echo $body | awk -F';' '{for(i=1;i<=NF;i++){print $i}}' > /tmp/messages.txt
# 将文件中出现的^M删除掉
sed -i 's/\x0D//g' /tmp/messages.txt
# 删除以空格开头的行前面的空格
sed -i 's/^\s*//g' /tmp/messages.txt

# 由于zabbix无论是故障还是恢复都是要发邮件的,但是对于故障和恢复的邮件内容需要定制为不同的内容,因此需要先获取到是故障还是恢复
state=$(echo $subject | awk -F: '{print $2}')

# 按照安心守护要求修改邮件正文内容
if [ $state == "PROBLEM" ]; then
    sed -i 's/Trigger:/异常对象:/' /tmp/messages.txt
    sed -i '/Trigger severity:/{h;d};/Item values:/{G}' /tmp/messages.txt
    sed -i 's/Trigger severity:/异常等级:/' /tmp/messages.txt 
    sed -i 's/Item values:/异常原因:/' /tmp/messages.txt
    sed -i '/Original event/d' /tmp/messages.txt
    sed -i '/Trigger status:/d' /tmp/messages.txt
    sed -i '$a发生时间: ' /tmp/messages.txt
    sed -i "s/发生时间: /发生时间: $(date "+%Y-%m-%d %H:%M:%S")/" /tmp/messages.txt
    # 把发生故障时的alertView插入alerts_view表
    alertValue=$(grep "异常原因" /tmp/messages.txt | awk -F: 'BEGIN{ORS=""};{for(i=3;i<=NF;++i) {print $i}}')
    echo "alertValue:$alertValue" >> /tmp/test.txt
    mysql -u${user} -p${passwd} -h${host} -D${database} -e "UPDATE alerts_view set alertValue='${alertValue}' WHERE viewid = '${viewid}'" 2>/dev/null
    sed -i 's/Warning/风险/' /tmp/messages.txt
    sed -i 's/Disaster/宕机/' /tmp/messages.txt
else
    sed -i 's/Trigger:/恢复对象:/' /tmp/messages.txt
    sed -i 's/Item values:/恢复内容:/' /tmp/messages.txt
    sed -i 's/影响业务/恢复业务/' /tmp/messages.txt
    sed -i '/Original event/d' /tmp/messages.txt
    sed -i '/Trigger status:/d' /tmp/messages.txt
    sed -i '/Trigger severity:/d' /tmp/messages.txt
    sed -i '$a发生时间: ' /tmp/messages.txt
    sed -i "s/发生时间: /发生时间: $(date "+%Y-%m-%d %H:%M:%S")/" /tmp/messages.txt
fi
    

/usr/local/bin/sendEmail -f monitor@wisedu.com -t "$to" -s smtp.exmail.qq.com -u "$subject" -o message-content-type=text -o message-charset=utf-8 -o message-file=/tmp/messages.txt -xu monitor@wisedu.com -xp anxinshouhu@2015 2>>/tmp/22.log

shell脚本发送邮件

 

(2)添加Media types

zabbix 主动 脚本 zabbix自定义脚本告警_zabbix 主动 脚本_25

 

(3)给指定的用户添加Media

zabbix 主动 脚本 zabbix自定义脚本告警_zabbix 主动 脚本_26

 

(4)配置Actions,为了业务需求定制Default message

zabbix 主动 脚本 zabbix自定义脚本告警_自定义_27

 

(5)邮件展示

故障邮件展示:

zabbix 主动 脚本 zabbix自定义脚本告警_自定义_28

故障恢复邮件展示:

zabbix 主动 脚本 zabbix自定义脚本告警_zabbix 主动 脚本_29