一、概要

1、说明
本文是继<LNMP环境部署zabbix实战><agent部署与zabbix web配置>的又一后续补充篇,众所周知作为监控系统主要就是数据采集,监控数据存储,再根据监控数据进行判断产生事件,进行报警通知管理员,同时通过展示接口进行数据的展示;本文主要关注zabbix的报警系统的实现及自定义脚本发送报警;
2、知识回顾
1)zabbix逻辑组件:
主机组(host groups)
主机(hosts)
应用(applications)
监控项(items)
触发器(triggers)
事件(events)
动作(actions):条件(conditions)和操作(operations)
媒介(media):发送通知通道;
通知(notifications)
远程命令(remote command)
报警升级(escalation)
模板(template)
图形(graph)
屏幕(screens)
幻灯(side show)
2)zabbix架构:
zabbix邮件报警及自定义脚本实战
根据以上的组件及架构说明:
zabbix监控系统包括zabbix-server(服务端)用来收集分析展示监控数据,同时定义各监控项数据的触发条件,用于报警;zabbix-agent(监控端)用于收集所在设备上的监控数据(可自定义监控什么),监控数据既可以主动也可以被发送到zabbix-server进行处理;同时也可以执行远程命令;在zabbix-server与zabbix-agent之间添加了zabbix_proxy这个代理监控服务,使用得zabbix监控系统支持分布式监控系统;

3、实验重点与环境
对于部署好了zabbix-server与agent并应用了对应的模块监控后,在web GUI上我们可以看到各监控的数据,对于出故障的服务我们需要提供报警通知管理的功能;因此本文主要讲述如何完善和自定义邮件报警功能;
zabbix-server: CentOS7.2_x64 172.16.3.152
zabbix-agent: CentOS7.2_x64 172.16.3.216 httpd服务
测试当httpd服务故障时第一步尝试远程重启httpd服务,如果不能解决发送邮件给管理员,恢复时发送恢复邮件!通过对http服务的状态感知报警系统的配置与作用!

二、zabbix报警系统

1、说明
zabbix报警系统是基于其他zabbix组件,并非是独立的,关系如下图所示:
zabbix邮件报警及自定义脚本实战

如上图所示,zabbix server通过item(可自定义) 从zabbix agent获取被监控端的各项数据,通过触发器trigger定义生成事件状态,满足条件后通过action处理,或发送邮件,或对目标主机远程执行命令!
2、发送报警信息的前提
a)配置发送信息的信道
管理-->管理媒介类型-->创建媒介类型-->如图:
zabbix邮件报警及自定义脚本实战

注意:在zabbix server上默认要安装有postfix服务无需要额外配置即可;以此为接下来的邮件发送测试服务器!实际当中这里配置购买的邮箱服务;自行搭建的服务器需要有备案的公网ip和邮箱服务的相关认证!

b)添加收件人
管理 --> 用户 --> 报警媒介 --> 添加 --> 类型(localmail) --> 收件人"root@localhost" -->添加-->更新
zabbix邮件报警及自定义脚本实战
zabbix邮件报警及自定义脚本实战

c)监控项item与触发器trriger
如有item需要有被监控端这里添加主机node2.san.com(172.16.3.216)如何通过web GUI添加,能主如何安装agent请参考之前文章;添加好被监控主机并应用监控模板即包含常规的application item以及trriger;

三、添加item监控项与触发器

任务如下:
测试当httpd服务故障时第一步尝试远程重启httpd服务,如果不能解决发送邮件给管理员,恢复时发送恢复邮件!
1、添加httpd的监控项
本次针对node2.san.com 上安装httpd服务,通过httpd服务的监控完成,故障发生与恢复时产生的事件进行发送报警邮件
默认Linux监控模块没有自带监控httpd(apache),所以这里需要针该主机创建监控httpd tcp 80端口的item监控项;
配置-->主机-->node2.san.com-->监控项-->创建监控项 -->名称"web server status" -->键值"net.tcp.listen[80]" (可以选择其他的方式) 如图:
zabbix邮件报警及自定义脚本实战
有了监控项(item)就有了从agent获取httpd状态的数据,以及默认的图形;
监测中-->最新数据-->找到node2.san.com中的 web server status -->图形 如图:
zabbix邮件报警及自定义脚本实战

光有item项及收获的数据还不行,需要对这些数据进行定义触发器,当满足条件时发出报警;如定义针对httpd状态的触发器,当状态不是1时(即80端口down异常) 做出action动作,或远程执行命令,或发出邮件等信息报警通知管理员!

2、添加httpd的触发器trriger
配置-->主机-->node2.san.com-->触发器-->创建触发器-->名称"web server down" -->严重性"严重" -->表达式-->添加 -->监控项选择"选择web server status" -->功能"最新的T值 = N" -->最后一个T值 "计数" 并填写1 -->插入 如图:
zabbix邮件报警及自定义脚本实战
最终表达式如下: {web service:net.tcp.listen[80].last(#1)}=0
如图:
zabbix邮件报警及自定义脚本实战

有了监控数据项,也有了对应的触发器,现在只剩下当触发器被触发时如何做了,换句话说就是httpd最后一次值是0时(即httpd服务down)如何做?这里就需要定义action动作了,action分两种,一种是远程执行命令,如重启httpd服务;一种是发邮件等信息通知到管理员!
3、添加action动作
动作:
配置-->动作-->创建动作-->名称 填写"Email" -->新的触发条件 "添加" -->选择web server down 触发器 如图:
zabbix邮件报警及自定义脚本实战
操作:
配置-->操作-->默认操作步骤持续时间 "60" -->默认接收人 "故障{TRIGGER.STATUS}:{HOSTNAME1}:{TRIGGER.NAME}" -->默认信息
"报警主机:{HOSTNAME1}
报警时间:{EVENT.DATE} {EVENT.TIME}
报警等级:{TRIGGER.SEVERITY}
报警信息:{TRIGGER.NAME}
报警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态: {TRIGGER.STATUS}:{ITEM.VALUE1}

Item values:
Original event ID: {EVENT.ID}"--->添加 如图:
zabbix邮件报警及自定义脚本实战

操作-->新的 -->步聚 "1 - 1" 表示动作第一步 -->步聚持续时间 默认60s 可不修改 表示第一步处理时间 -->操作类型"远程命令" -->目标列表 添加"当前主机" -->类型-->自定义脚本 -->执行在 zabbix agent端 -->命令 "sudo systemctl restart httpd"--> 添加 如图:
zabbix邮件报警及自定义脚本实战

注意此处远程执行命令方式有多种:如ssh/telnet/IPMI/全局脚本/自定义脚本等方式;最为方便的是通过agent执行
但这里有两个前提需要在agent机器上配置/etc/sudoers
修改添加以下两项:
大约在56行 注释Defaults requiretty
添加: zabbix ALL=(ALL) NOPASSWD: ALL
别一个前提是修改zabbix_agent.conf文件中的
EnableRemoteCommands=1
重启zabbix-agent服务

操作-->新的 -->步聚"2-0" 表示第二步 即第一步没有 处理好 从第二步开始一直执行 -->步聚持续时间 默认60s 可不修改 表示第一步处理时间 -->操作类型"发送消息" -->发送到用户 "选择admin" -->仅送到" 创建的localmail 信道" -->添加 -->更新 如图:
zabbix邮件报警及自定义脚本实战

恢复操作:
配置-->恢复操作-->默认接收人"恢复{TRIGGER.STATUS}:{HOSTNAME1}: {TRIGGER.NAME} OK!" -->默认信息
"
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
" -->添加
最终action动作如下:
zabbix邮件报警及自定义脚本实战
对恢复操作添加发送信息
恢复操作-->操作-->添加-->操作类型-->发送消息-->发送到用户-->选择 "Admin (Zabbix Administrator)" -->仅送到"localmail" -->添加-->更新 如图:
zabbix邮件报警及自定义脚本实战

四、测试

关闭agent 上httpd服务
[root@node2 ~]# systemctl stop httpd
查看zabbix事件信息
监测中-->问题 如图:
zabbix邮件报警及自定义脚本实战
可以发现已经监测到httpd服务宕机了,并且第一步的远程执行命令成功~!
同时在zabbix server机器上通过命令行输入mail查看root邮件

[root@zabbix ~]# mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/root": 9 messages 9 new
>N  1 zabbix@localhost.san  Fri Mar  2 16:33  22/983   "故障PROBLEM:web service:web server down"
  N  2 zabbix@localhost.san  Fri Mar  2 16:40  21/906   "恢复OK:web service: web server down OK!"
& 
1
Message  1:
From zabbix@localhost.san.com  Fri Mar  2 16:34:24 2018
Return-Path: <zabbix@localhost.san.com>
X-Original-To: root@localhost
Delivered-To: root@localhost.san.com
From: <zabbix@localhost.san.com>
To: <root@localhost.san.com>
Date: Fri, 02 Mar 2018 16:34:24 +0800
Subject: 故障PROBLEM:web service:web server down
Content-Type: text/plain; charset="UTF-8"
Status: R

报警主机:web service
报警时间:2018.03.02 16:32:21
报警等级:High
报警信息:web server down
报警项目:net.tcp.listen[80]
问题详情:web server status:0
当前状态: PROBLEM:0

Item values:
Original event ID: 53& 

2
Message 2:
From zabbix@localhost.san.com  Fri Mar  2 16:40:55 2018
Return-Path: <zabbix@localhost.san.com>
X-Original-To: root@localhost
Delivered-To: root@localhost.san.com
From: <zabbix@localhost.san.com>
To: <root@localhost.san.com>
Date: Fri, 02 Mar 2018 16:40:55 +0800
Subject: 恢复OK:web service: web server down OK!
Content-Type: text/plain; charset="UTF-8"
Status: R

告警时间:2018.03.02 16:32:21
告警等级:High
告警信息: web server down
告警项目:net.tcp.listen[80]
问题详情:web server status:1
当前状态:OK:1
事件ID:53&

五、添加自定义脚本发送信息

添加媒介
管理-->管理媒介类型-->创建媒介类型-->媒介名称"sentscript" -->类型"脚本" -->脚本名称"sentmail.sh" -->添加三个脚本参数"{ALERT.SENDTO} ; {ALERT.SUBJECT} ; {ALERT.MESSAGE}" 分别表示收件人,标题,信息; 如图:
zabbix邮件报警及自定义脚本实战

添加收件人
管理 --> 用户 --> 报警媒介 --> 添加 --> 类型(sentscript) --> 收件人"root@localhost" -->添加-->更新

修改httpd触发器中的第二步报警信息为sentscript
在管理--动作-->Email-->操作-->编辑2-0步 -->仅送到 修改为"sentscript" -->更新 如图:
zabbix邮件报警及自定义脚本实战

编写自定义脚本
在zabbix server上默认存放自定义脚本的目录在

cat /usr/lib/zabbix/alertscripts/sentmail.sh

#!/bin/bash
contact=$1
subject="$2"
content="$3"

echo "${content}" | mail -s $subject $contact

注意这里的脚本名称必须和媒介中的脚本名保持一致!
重启zabbix-server服务

测试:
关闭node2.san.com上的httpd服务查看zabbix 信息

如图:
zabbix邮件报警及自定义脚本实战

在zabbix service上命令行输入mail

[root@zabbix alertscripts]# mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
......省略.......
>N 15 Zabbix Monitoring Sy  Fri Mar  2 17:17  23/998   "故障PROBLEM:web"
& 15
Message 15:
From zabbix@zabbix.san.com  Fri Mar  2 17:17:17 2018
Return-Path: <zabbix@zabbix.san.com>
X-Original-To: root@localhost
Delivered-To: root@localhost.san.com
Date: Fri, 02 Mar 2018 17:17:17 +0800
To: root@localhost.san.com, down@zabbix.san.com,
    server@zabbix.san.com
Subject: 故障PROBLEM:web
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: application/octet-stream
From: zabbix@zabbix.san.com (Zabbix Monitoring System)
Status: R

[Binary content]

说明我们算定义发送邮件脚本正常!

总结:

本次通过对zabbix web GUI添加httpd服务的监控项,定义触发器,添加报警媒介,以及自定义脚本报警媒介;同时对报警做了分级处理;如第一次尝试远程命令恢复;再发送邮件到管理的一系列日常实用的报警配置!采用3.2版本并且已经配置成中文,如有错误或遗漏之处,欢迎留言指正交流!谢谢!