CentOS 7.6 zabbix5.0监控实现微信告警

一、配置zabbix客户端

1、环境说明

服务端配置请看这一篇:CentOS7.6 源码安装zabbix5.0及初始化配置(超详细)

服务端:192.168.245.204
客户端:192.168.245.203

这里测试基于http服务的告警,如果服务down了就微信通知告警
这里还需要安装注册企业微信,请提前安装好,后面有说明

服务端配置好以后,我们需要配置客户端,客户端需要安装zabbix_agent并启动才能让zabbix服务器监控到它

2、下载zabbix_agent

首先下载zabbix_agent,我这里是源码安装的

[root@dockertest ~]# wget https://cdn.zabbix.com/zabbix/binaries/stable/5.0/5.0.13/zabbix_agent-5.0.13-linux-3.0-amd64-static.tar.gz

创建一个目录用于存放文件

[root@dockertest ~]# mkdir /usr/local/zabbix_agent

解压源码包到zabbix_agent目录

[root@dockertest ~]# tar xf zabbix_agent-5.0.13-linux-3.0-amd64-static.tar.gz -C /usr/local/zabbix_agent

3、修改配置文件

修改配置文件zabbix_agentd.conf

[root@dockertest ~]# cd /usr/local/zabbix_agent/
[root@dockertest zabbix_agent]# vim  conf/zabbix_agentd.conf
Server=192.168.245.204
ServerActive=192.168.245.204
Hostname=Apache web server
UnsafeUserParameters=1

制作命令的软链接

[root@dockertest zabbix_agent]# ln -s /usr/local/zabbix_agent/bin/* /usr/local/bin/
[root@dockertest zabbix_agent]# ln -s /usr/local/zabbix_agent/sbin/* /usr/local/sbin/

然后需要把配置文件放到/usr/local/etc/zabbix_agentd.conf下否则无法启动

[root@dockertest zabbix_agent]# cp conf/zabbix_agentd.conf /usr/local/etc/zabbix_agentd.conf

还要创建系统用户和组zabbix否则也无法启动

[root@dockertest zabbix_agent]# groupadd --system zabbix
[root@dockertest zabbix_agent]# useradd --system -g zabbix -d /usr/lib/zabbix -s /sbin/nologin -c "Zabbix Monitoring System" zabbix

4、启动zabbix_agentd

启动zabbix客户端程序

[root@dockertest zabbix_agent]# zabbix_agentd
[root@dockertest zabbix_agent]# netstat -antp | grep zabbix
tcp        0      0 0.0.0.0:10050           0.0.0.0:*               LISTEN      31625/zabbix_agentd

到服务端上去检查一下能否获得客户端的信息

[root@zabbix-server ~]# zabbix_get -s 192.168.245.203 -p 10050 -k system.uname
Linux dockertest 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64

二、安装启动httpd

因为我们监控的是客户端的http服务,所以安装apache并启动

[root@dockertest zabbix_agent]# yum -y install httpd
[root@dockertest zabbix_agent]# systemctl start httpd

三、监控告警设置

1、创建模板

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、创建应用集

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、创建监控项

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、创建触发器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5、创建主机

添加被监控端主机的信息
在这里插入图片描述

在这里插入图片描述

6、为主机应用模板

这边建议创建模板然后创建主机,然后到主机里去链接到模板,这样比较灵活,因为有可能你要对多个主机应用同一个模板,就不用一个个创建
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
链接好查看应该是这样的
在这里插入图片描述

四、设置微信

服务器设置好以后就开始对微信进行相关设置

1、注册企业微信

https://work.weixin.qq.com/wework_admin/register_wx

不复杂比较简单哦!
在这里插入图片描述
注册好了就可以点击进入后台管理页面
在这里插入图片描述

2、创建部门

在这里插入图片描述
在这里插入图片描述
然后选择管理员账号就可以了

3、创建应用

在这里插入图片描述在这里插入图片描述

4、调试接口

创建好之后需要进行接口的调试,这一步主要就是测试我们之后微信可否能发成功

微信企业号接口调试工具:
https://open.work.weixin.qq.com/wwopen/devtool/interface/combine

调试的时候需要两样东西

1、企业id
在这里插入图片描述
2、secret
在这里插入图片描述
在这里插入图片描述
企业微信团队会给你发消息,点击“前往查看”
在这里插入图片描述
把secret复制到电脑上
在这里插入图片描述

在这里插入图片描述

五、微信告警脚本

下面就开始编写微信告警的脚本了

告警脚本存放位置:/usr/local/share/zabbix/alertscripts

1、安装python3.6

因为微信告警脚本是python写的,所以需要先安装python,系统预装python版本是2.7,实践会报错找不到模块

ImportError: No module named 'typing'

所以需要安装python3.6解决,但yum支持不了这么高版本的python,所以这里用源码安装python,然后装requests模块的时候也不要用系统预装的pip,用pip3

yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel

wget https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz

tar -xf Python-3.6.4.tgz

mkdir -p /usr/local/Python3

cd Python-3.6.4/

./configure --prefix=/usr/local/python3
 
make && make install

ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3.6 /usr/bin/pip3

cd /usr/local/python3

pip3 install requests    //requests是一个Python第三方库,处理URL资源特别方便

2、编写告警脚本

一定要到告警脚本目录下,把微信的告警脚本放进去,这里是找的网上的版本,自己根据实际情况把重要字段改了下,需要修改的地方后面用#注释标明了,需要改成自己微信相关的信息

[root@zabbix-server python3]# cd /usr/local/share/zabbix/alertscripts
[root@zabbix-server alertscripts]# vim wechat.py
#!/usr/bin/python2.7
#_*_coding:utf-8 _*_
#auther:火星小刘
 
import requests,sys,json
import urllib3
urllib3.disable_warnings()
 
reload(sys)
sys.setdefaultencoding('utf-8')
 
def GetTokenFromServer(Corpid,Secret):
    Url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
    Data = {
        "corpid":Corpid,
        "corpsecret":Secret
    }
    r = requests.get(url=Url,params=Data,verify=False)
    print(r.json())
    if r.json()['errcode'] != 0:
        return False
    else:
        Token = r.json()['access_token']
        file = open('/tmp/zabbix_wechat_config.json', 'w')
        file.write(r.text)
        file.close()
        return Token
 
def SendMessage(User,Agentid,Subject,Content):
    try:
        file = open('/tmp/zabbix_wechat_config.json', 'r')
        Token = json.load(file)['access_token']
        file.close()
    except:
        Token = GetTokenFromServer(Corpid, Secret)
 
    n = 0
    Url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s" % Token
    Data = {
        "touser": "S*****ie",                  # 企业号中的用户帐号,在zabbix用户Media中配置,如果配置不正常,将按部门发送。 		  
        #"totag": Tagid,                                # 企业号中的标签id,群发使用(推荐)
        "toparty": "2",                             # 企业号中的部门id,群发时使用。
        "msgtype": "text",                              # 消息类型。
        "agentid": "1000002",                             # 企业号中的应用id。
        "text": {
            "content": Subject + '\n' + Content
        },
        "safe": "0"
    }
    r = requests.post(url=Url,data=json.dumps(Data),verify=False)
    while r.json()['errcode'] != 0 and n < 4:
        n+=1
        Token = GetTokenFromServer(Corpid, Secret)
        if Token:
            Url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s" % Token
            r = requests.post(url=Url,data=json.dumps(Data),verify=False)
            print(r.json())
 
    return r.json()
 
 
if __name__ == '__main__':
    User = sys.argv[1]                                                                # zabbix传过来的第一个参数
    Subject = str(sys.argv[2])                                                      # zabbix传过来的第二个参数
    Content = str(sys.argv[3])                                                     # zabbix传过来的第三个参数
 
    Corpid = "ww6ba7489884e59b0c"                                                  # CorpID是企业号的标识
    Secret = "Mnzu5QIAKF5zJqg-2N33PDbssY9Kx3RK1XxA8FTNgUk"                         # Secret是管理组凭证密钥
    #Tagid = "1"                                                                        # 通讯录标签ID
    Agentid = "1000002"                                                                 # 应用ID
    Partyid = "2"                                                                      # 部门ID
 
    Status = SendMessage(User,Agentid,Subject,Content)
    print Status

获取touser里的用户账号:
在这里插入图片描述
在这里插入图片描述

获取Partyid:
在这里插入图片描述
获取Agentid:
在这里插入图片描述

修改完别忘了加可执行权限

[root@zabbix-server alertscripts]# chmod +x wechat.py

3、脚本测试

手动测试一下发一条信息看微信能不能收到

[root@zabbix-server alertscripts]# ./wechat.py S******e test hello
/usr/lib/python2.7/site-packages/urllib3/connectionpool.py:769: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.org/en/latest/security.html
  InsecureRequestWarning)
{u'access_token': u's3eqGeu6Sr9ZyFsar8ll9TgxInJ9UhYrH6TbyUg9xkI63FrSUjZQYS44hwEVGJP4krUBVP-qrViPwiADf929tBa1oCyRHIwqZkMhuMEboOqgumYql1bTpvphaYJZFcpyfyHq50cLKZiFzudgggJXcgbfGlE5vJHA8gvUHeHeejluQxWO39N40qgTscHOy_eotm-VWFuFBTXB39Yqvph5Sg', u'expires_in': 7200, u'errcode': 0, u'errmsg': u'ok'}
{u'invaliduser': u'', u'errcode': 0, u'errmsg': u'ok'}
wechat.py的三个参数:
企业账号:S*****e
标题:test
内容:hello

能收到说明我们微信告警的脚本就没问题了,可以用了
在这里插入图片描述
测试报警之前需要修改一下这个文件的权限:zabbix_wechat_config.json
这个文件是用来存放刚才接口调用的返回结果的
否则之后告警会报没有权限而无法发送

[root@zabbix-server ~]# ll /tmp/zabbix_wechat_config.json
-rw-r--r-- 1 root root 277 7   7 17:52 /tmp/zabbix_wechat_config.json

[root@zabbix-server ~]# chown zabbix.zabbix /tmp/zabbix_wechat_config.json

六、配置告警媒介

1、创建媒介类型:wechat

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、配置动作

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

故障问题:{EVENT.NAME}
告警主机:{HOSTNAME1}

告警时间:{EVENT.DATE} {EVENT.TIME}

告警等级:{TRIGGER.SEVERITY}

告警信息: {TRIGGER.NAME}

告警项目:{TRIGGER.KEY1}

问题详情:{ITEM.NAME}:{ITEM.VALUE}

当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}

事件ID:{EVENT.ID}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

故障恢复:{EVENT.NAME}
恢复主机:{HOSTNAME1}

主机IP:{HOST.IP}

恢复时间:{EVENT.RECOVERY.TIME}    //网上很多这里写的跟告警时间是一样的,如果是这样会出现故障恢复了才会发告警信息,这一般不符合逻辑,所以需要改成这样

告警等级:{TRIGGER.SEVERITY}

告警项目:{TRIGGER.KEY1}

当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}

事件ID:{EVENT.ID}

在这里插入图片描述
在这里插入图片描述

3、应用到用户

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
然后就可以测试报警啦

七、告警测试

到客户端上把http服务停掉

[root@dockertest ~]# systemctl stop httpd

大概几秒钟之后zabbix的主页就能同步状态并提示已发送告警
在这里插入图片描述
微信收到如下提示:
在这里插入图片描述
再到客户端把http服务开启,主页问题就消失了,微信收到如下信息,测试成功

[root@dockertest ~]# systemctl start httpd

在这里插入图片描述


版权声明:本文为shengjie87原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。