Zabbix 3.4.4默认自带3种报警方式,SMTP邮件服务报警,Jabber报警,GSM调制解调器(短信)报警。这里面除了SMTP邮件服务报警比较实用以外,其他的报警方式用的并不多。Jabber在国内用的就不多,也很少有人会为Zabbix搞一个Jabber服务,而且给Zabbix服务器在添加一个GSM外设装置的人就更少了。但是仅仅使用邮件报警是很单薄的,一般的企业都会有自己的短信接口,推送接口,甚至电话接口。所以需要更方便适配更广泛的报警方式。
所以比较好的一种报警方式就是当触发器被激活时,自动运行Zabbix Server上的一个shell脚本,Zabbix服务在运行这个脚本的同时传递几个参数,这些参数包含了报警信息,时间,报警主机等等消息,而有了shell脚本之后,我们就可以通过编程的方式实现各种各样五花八门的报警工具,包括短信报警,微信报警,灯光声音报警等等。
我这里实现了一个短信报警,短信发送平台是第三方的一个产品,这个短信发送平台的接口是基于Socket通信的,直接使用shell对接是不可行的,因为用shell做套接字编程很麻烦。所以这里我使用tomcat搭建了一个小型的转发平台。shell脚本通过curl或者wget命令,使用HTTP的GET请求,把报警信息写在URL当中(如"http://x.x.x.x/sms?msg=xxxx&receiver=xxxx"),把报警信息发送给tomcat服务器,tomcat根据URL解析出报警信息,然后拼接xml报文,并通过Socket编程发送到第三方的短信平台。然后接受者就可以收到相关短信了。
下面介绍一下具体的实现方法,总共分四个步骤
1、根据业务需要编写shell脚本
2、建立新的报警媒介并关联上一步的shell脚本
3、建立新的Zabbix用户,录入用户的号码
4、建立新的“动作”关联上面的报警媒介和用户
首先我们写一个shell脚本,这个脚本会接收4个参数,zabbix服务器报警后会执行一个“动作”,然后自动执行这个脚本,我这里使用Zabbix服务端的版本是3.4.4,使用的是Docker容器版,Docker容器的操作系统是alpine,是一个很精简的linux系统,没有curl,只有wget所以我只能使用wget发送HTTP请求。好在这个alpine内部预装了python 2.7.5,可以使用python脚本实现一些复杂的操作。
这个shell脚本非常的简单,就是接收参数,然后进行urlencode(因为使用wget发送URL时,URL中不能出现中文、特殊符号等,必须进行转换,比如空格要转换成%20,做过前端的同学应该都知道,这个urlencode我使用python进行实现)
下面是这个报警shell脚本,文件名为oaalert.sh
#!/bin/bash
PHONE=$1
MSG1=$(/home/urlencode.py "$(date +"%Y-%m-%d %H:%M:%S")")
MSG2=$(/home/urlencode.py "$2")
MSG3=$(/home/urlencode.py "$3")
MSG4=$(/home/urlencode.py "$4")
cd /home
/usr/bin/wget -O result.txt -c "http://192.166.1.194:8089/sms?msg=$MSG1%0A$MSG2%0A$MSG3%0A$MSG4&receiver=$PHONE"
上面脚本中需要传入4个参数,第一个是发送的电话号码,第二个是短信标题,第三个是短信内容,第四个是落款,这四个参数都是在Zabbix 的“报警媒介”中配置的,可以根据业务需要增加或者减少参数数量。我们把shell报警脚本放到/usr/lib/zabbix/alertscripts/这个目录下,这个目录在zabbix的docker已经给我们建好,我们直接把shell脚本放进去并增加可执行权限即可。
参数传入之后,可能会有中文,所以需要进行URL编码转换,下面贴出urlencode的python脚本,适用于python2.7
#!/usr/bin/python
#coding=utf-8
from urllib import quote
import sys
import string
#print sys.argv[1]
url = sys.argv[1]
#url_encode = quote(url, safe=string.printable)
url_encode = quote(url).replace('/','%2F')
print url_encode
然后我们到Zabbix网页后台增加一个新的报警媒介,与邮件、SMS、Jabber报警并列。这个步骤需要到“管理”-“报警媒介类型”页面中,点击右上角的“创建报警媒介类型”按钮
这里的名称可以随便填,脚本名称填写你脚本文件的文件名。类型选择“脚本”
参数这里可以参考其他三种媒介来填写,这里{ALERT.SENDTO}是Zabbix用户中维护的联系方式,下文会细讲,{ALERT.SUBJECT}是默认接收人,但是我把它做成短信标题来使用了,{ALERT.MESSAGE}是报警的内容,由“动作”的配置决定,第四个参数是一个落款,让短信接受者了解是谁发出的。
然后点击下方的保存,然后观察一下是否是启用状态,我们的媒介就会变成四个
右边的“选项”选项卡保持默认即可,默认是脚本执行不成功后尝试重新执行三次。Zabbix很好的一点是执行脚本能在Web界面直接观察是否执行成功,如果没有执行成功还能在Web页面看到脚本的stderr输出,分析脚本失败原因非常方便。这里要大大的给Zabbix点个赞。
然后我们把短信接受者的电话号码也配置到Zabbix中,这里我们需要到“管理”-“用户”界面中创建一个新用户或者使用现有的用户,一般创建新用户比较方便
我们创建一个新用户,基本信息简单填填就可以了,如下
重点是中间那个选项卡“报警媒介”,这里我们选择我们上一步建立的脚本,启用时间就是周几到周几,几点到几点,一般使用默认的7x24h就可以,除非你晚上不想收到报警。如下图
然后点击添加,并观察是否启用
最后不要忘了点击“更新”按钮
注:因为我上面的shell脚本中电话号码是通过参数传入的,所以需要在用户中添加“收件人”的号码,如果你是写死在shell脚本中,或者写死在报警媒介类型里,就不需要在“用户”中维护电话号码。
然后最后一步,我们只需在触发器报警时关联一个“动作”即可。这一步需要到“配置”-“动作”中,点击右上角的创建动作,然后选择需要监控的主机作为动作的出发条件
重点是后面几个标签页,其中“操作”是触发器激活时的动作,“恢复操作”是问题修复后的动作,“确认操作”是触发器被手动确认后的动作,一般“操作”和“恢复操作”各发送一条短信
这里根据前面我们创建“报警媒介”时的配置来对比观察,前面写的{ALERT.SUBJECT}就是这里的“默认接收人”,{ALERT.MESSAGE}就是消息的内容,这里我把接收人的手机号写到了“用户”中去,所以这里接收人我就换成了短信标题内容。
下面的操作就需要关联“用户”和“报警媒介”,我的配置如下。主要就是设置“发送到用户”和“仅送到”为我们前两步配置的项目。
这里还可以实现更加复杂的报警模式,比如分步骤,分递进关系等等,这里就不再赘述。
然后就全部配置完毕了。可以让尝试让一台主机报一次警试试,并在Zabbix上观察脚本的执行情况