Zabbix 随笔:企业微信小程序告警篇

2022-02-16 18:46:30 浏览数 (1)

本文利用企业微信的方式告警。不过该方式有一个比较重要的前提,Zabbix Server 需要有访问外网的能力,接收端也需要有访问互联网的能力。

正文

本文环境为 python3,python2 的环境自行测试,如遇到问题可以及时与我联系。

本文环境

  • Zabbix Server 6.0 LTS RC2
  • Python 3

企业微信部分

登录企业微信后台

在应用管理菜单选择创建应用

这里需要设置可见范围

创建完成后,可以查看AgentId,Secret 需要登录客户端或者移动客户端查看

那么自此我们应该得到的有四个信息

  • corpid
  • corpsecret
  • agentid
  • 部门 ID

代码部分

根据上述的部分我们需要修改脚本四个信息

  • Python2
  • Python3
代码语言:javascript复制
#!/usr/bin/python2
#_*_coding:utf-8 _*_
import urllib,urllib2
import json
import sys

reload(sys)
sys.setdefaultencoding('utf-8')
def gettoken(corpid,corpsecret):
    gettoken_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid='   corpid   '&corpsecret='   corpsecret
    print  gettoken_url
    try:
        token_file = urllib2.urlopen(gettoken_url)
    except urllib2.HTTPError as e:
        print e.code
        print e.read().decode("utf8")
        sys.exit()
    token_data = token_file.read().decode('utf-8')
    token_json = json.loads(token_data)
    token_json.keys()
    token = token_json['access_token']
    return token
def senddata(access_token,user,subject,content):
    send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token='   access_token
    send_values = {
        "touser":"$1",   
        "toparty":"修改成您的部门 ID",        
        "msgtype":"text",     
        "agentid":"修改成您的 agentid",  
        "text":{
            "content":subject   'n'   content
           },
        "safe":"0"
        }
    send_data = json.dumps(send_values, ensure_ascii=False).encode('utf-8')
    send_request = urllib2.Request(send_url, send_data)
    response = json.loads(urllib2.urlopen(send_request).read())
    print str(response)

if __name__ == '__main__':
    user = str(sys.argv[1])     
    subject = str(sys.argv[2])  
    content = str(sys.argv[3])  

    corpid =  '修改成你的corpid'     
    corpsecret = '修改成你的corpsecret'
    accesstoken = gettoken(corpid,corpsecret)
    senddata(accesstoken,user,subject,content)
代码语言:javascript复制
#!/usr/bin/python3
#_*_coding:utf-8 _*_
import urllib.request
import json
import sys

def gettoken(corpid,corpsecret):
    gettoken_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid='   corpid   '&corpsecret='   corpsecret
    print  (gettoken_url)
    try:
        token_file = urllib.request.urlopen(gettoken_url)
    except urllib.error.HTTPError as e:
        print (e.code)
        print (e.read().decode("utf8"))
        sys.exit()
    token_data = token_file.read().decode('utf-8')
    token_json = json.loads(token_data)
    token_json.keys()
    token = token_json['access_token']
    return token

def senddata(access_token,user,subject,content):

    send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token='   access_token
    send_values = {
        "touser":"$1",   
        "toparty":"修改成您的部门 ID",        
        "msgtype":"text",     
        "agentid":"修改成您的 agentid",  
        "text":{
            "content":subject   'n'   content
           },
        "safe":"0"
        }
#    send_data = json.dumps(send_values, ensure_ascii=False)
    send_data = json.dumps(send_values, ensure_ascii=False).encode('utf-8')
    send_request = urllib.request.Request(send_url, send_data)
    response = urllib.request.urlopen(send_request)
    msg = response.read()
    print ("returned value : "   str(msg))


if __name__ == '__main__':
    user = str(sys.argv[1])     
    subject = str(sys.argv[2])  
    content = str(sys.argv[3])  

    corpid =  '修改为你的corpid'     
    corpsecret = '修改成你的corpsecret'
    accesstoken = gettoken(corpid,corpsecret)
    senddata(accesstoken,user,subject,content)
复制脚本到您的系统

默认 CentOS 7 为 python2,CentOS 8 为 python3 创建一个 wechat.txt 文件,这么做是避免 Windows 与 Linux 的编码格式问题

代码语言:javascript复制
touch wechat.txt 
vim wechat.txt

完成修改后,将文件后缀改为py结尾

代码语言:javascript复制
mv wechat.txt wechat.py
测试脚本

先给执行权限,随后执行脚本查看状态

代码语言:javascript复制
chmod  x wechat.py
./wechat.py 1 1 1 

Zabbix部分

查询告警脚本目录

默认配置该目录是注释的(如下图),建议将注释取消掉,然后重启 Zabbix Server 服务。

代码语言:javascript复制
cat /etc/zabbix/zabbix_server.conf | grep AlertScriptsPath
移动脚本到指定目录
代码语言:javascript复制
mv wechat.py /usr/lib/zabbix/alertscripts

Zabbix 前端部分

创建告警媒介路径为 管理 –> 报警媒介类型 –> 创建报警媒介类型

报警媒介配置

首先类型选择脚本,名称自己定义,脚本名称为放入指定目录的脚本名称,一定要对应,脚本参数和 python 里的顺序一一对应,python 里有三个参数 分别是 user <–> {ALERT.SENDTO}, subject <–> {ALERT.SUBJECT},content <–> {ALERT.MESSAGE},后面的宏为固定值。

前端的变量与后端脚本有紧密联系,如果 Python 脚本传参部分(sys.argv[])只有两个,就只需要写两个即可。

进入到 Message templates 里面(这里的作用为消息通知模板,包含一些变量,也就是需要告警包含哪些内容,不填写会出现告警失败),创建通知模板,点击添加,默认就有一些自带的模板,这里也可以不用设置,在后面的动作里可以创建自定义消息模板,关于美化可以参考后续文章美化篇。

测试脚本可用性

进入告警媒介类型选项,找到刚刚创建的企业微信小程序,点击测试

这里收件人、主题、消息都可以随便写,然后点击测试

当出现下图结果即为正常

模拟告警流程测试

用户部分授权

路径为 管理 –> 用户 –> 点击 Admin 用户 –> 报警媒介 –> 添加 选择类型为刚才创建的告警类型媒介,收件人随便填写,启用和告警级别根据自身情况填写。

找到报警媒介,点击添加,类型找到之前告警媒介类型里的企业微信小程序,收件人随便填写,这步骤不做告警产生的时候会报错,提示无用户定义,告警发送失败

创建动作

路径为 配置 –> 动作 –> 触发器动作 –> 创建动作

进入动作里,条件有很多类型可以选择,根据自身情况灵活定制,本文以主机群组为条件。

在操作细节里不具体展开,步骤在后续告警升级里会详细展开,本文以用户群组为基础,仅送到企业微信小程序为示例,这里大家可以根据实际情况调整,Custom message 部分在前面告警类型里已经创建了通知模板,这里可以不需要创建,优先级:操作细节里的自定义消息>告警类型里的模板。

这里需要注意的是模板必须存在,不然一样告警会出现失败,如果出现媒介未定义,就是整个问题。

模拟告警

创建虚拟主机

这里建一个无法 ping 通的主机,由于前面选择的条件为主机组,所以这里需要加入到 Zabbix Server 主机组,仅为演示,根据自身情况再调整,模板选择 ICMP Ping(在 Templates/Modules 下)

模拟告警

由于无法 ping 通,等待一段时间前端应该会出现 Unavailable by ICMP ping 的告警,也有相应的动作,灰色代表正常,如果是红色代表发送失败,具体可以分析下原因。

效果

如果需要在手机查看,需要关注二维码,否则只能在企业微信里查看。

写在最后

整个微信告警部分其实最难就是小程序部分,需要调整的参数比较多,相反机器人告警的方式比较简单,只需要调用机器人的 webhook 地址即可,后续我会补充微信机器人的告警,通过和一些网上朋友聊天,他们遇到的问题其实还是没有用心去理解这么做的一些含义,当然还有就是对 python 的不太熟悉的缘故,在测试的时候要思考一些问题发生的原因,很多问题在互联网上是可以找到的,最后路漫漫其修远兮,吾将上下而求索,祝大家新年快乐!

0 人点赞