zabbix报警(向消息中心发送报警信息)

Posted wangyajian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zabbix报警(向消息中心发送报警信息)相关的知识,希望对你有一定的参考价值。

一、zabbix web界面的配置

重点:zabbix执行报警脚本时,有对脚本的执行权限,但是没有对脚本中的命令执行的权限,需要在sudoers文件中为zabbix用户添加用户权限。

1.创建脚本的报警媒介
技术图片

脚本路径可以在server的配置文件中配置

[root@localhost]# cat /etc/zabbix/zabbix_server.conf |grep "alertscripts"
# AlertScriptsPath=$datadir/zabbix/alertscripts
AlertScriptsPath=/usr/lib/zabbix/alertscripts

[root@localhost]# ls /usr/lib/zabbix/alertscripts/
zabbix_alert.sh

输入脚本名称,类型选择脚本并添加以下3个参数,分别对应sendEmail.sh脚本需要的3个参数:收件人地址、主题、详细内容

ALERT.SENDTO  
ALERT.SUBJECT  
ALERT.MESSAGE

2.为用户添加报警媒介,这里就不创建新的用户,而是用admin用户报警
技术图片

3.创建动作并进行配置
技术图片

技术图片

技术图片

动作参数说明

告警主机:HOSTNAME1
告警时间:EVENT.DATE EVENT.TIME
告警等级:TRIGGER.SEVERITY
告警信息: TRIGGER.NAME
告警项目:TRIGGER.KEY1
问题详情:ITEM.NAME:ITEM.VALUE
当前状态:TRIGGER.STATUS:ITEM.VALUE1
事件ID:EVENT.ID
环境信息:UAT

二.脚本的编写以及说明

??由于预生产环境不能连接外网,所以需要把报警信息推送到项目系统的消息中心模块。而向消息中心发送消息需要携带token,采用python3 + requests的方式获取token,向消息中心发送消息。(对于shell熟悉程度不高)
??由于编译安装python3需要的依赖包很多,在没有外网的情况下安装依赖包非常DT。所以采用docker容器的方式,启动一个python3的容器来执行脚本。

1.脚本如下

#!/usr/bin/env python3
import requests
import json
import sys
class ZabbixAlert(object):
    login_url = 'https://xx.xxx.com/api/login'
    login_headers = 
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
    
    login_data = 
        'username': 'admin',
        'password': 'xxxxxx',
    

    submit_url = 'https://xx.xxx.com/message/submit'

    # 获取token
    def get_auth_token(self):
        response = requests.post(url=self.login_url,data=self.login_data,headers=self.login_headers)
        response_dict = json.loads(response.text)
        return response_dict['X-Auth-Token']

    # 携带token发送报警信息
    def send_message(self,sendto,subject,message):
        x_auth_token = self.get_auth_token()
        headers = 
            'Content-Type':'application/json;charset=UTF-8',
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
            'x-auth-token':x_auth_token,
        
        data = 
            'appname':"GCREPORT-新闻中心",
            'content': "<p><br></p><p><br></p><p><br></p>".format(sendto,subject,message),
            'createuser': "admin",
            'destusers': [],
            'title': "zabbix测试",
            'type': "新闻",
        
        response = requests.post(url=self.submit_url,headers=headers,data=json.dumps(data))
        return response.text


sendto = sys.argv[1]
subject = sys.argv[2]
message = sys.argv[3]
zbx = ZabbixAlert()
print(zbx.send_message(sendto,subject,message))

2.生成docker镜像并上传服务器

在一台能上外网的机器生成镜像
[root@common docker]# cat Dockerfile 
FROM python:3.6
RUN pip3 install requests 

[root@common docker]# docker build -t python3:v1 .
[root@common docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
python3             v1                  0f4e54b7f396        8 minutes ago       922 MB
docker.io/python    3.6                 1c515a624542        36 hours ago        913 MB

导出镜像并上传到预生产环境
[root@common docker]# docker save -o python3.tar python3:v1

在预生产机器上导入镜像,将本地的脚本目录映射到容器中的某个目录,方便修改python脚本的参数。

脚本说明:send_message.py为发送告警信息的脚本,zabbix_alert.sh为zabbix触发动作后调用的脚本。
[root@localhost alertscripts]# ls /usr/lib/zabbix/alertscripts/
send_message.py  zabbix_alert.sh

命令一定要加上绝对路径,不加zabbix调用时会找不到命令,$1 $2 $3需要加上双引号,不加 python通过sys.argv取参数时会出现问题。
[root@localhost alertscripts]# cat zabbix_alert.sh 
#!/bin/bash
/bin/sudo /usr/bin/docker exec python /alertscripts/send_message.py "$1" "$2" "$3"

导入镜像
[root@localhost]# docker load -i /usr/local/src/python3.tar 
660314270d76: Loading layer [==================================================>]  119.2MB/119.2MB
6d5a64ea8f37: Loading layer [==================================================>]  17.11MB/17.11MB
74e2ede3b29c: Loading layer [==================================================>]  17.83MB/17.83MB
97e8dd85db4e: Loading layer [==================================================>]  149.8MB/149.8MB
6e302bbcacce: Loading layer [==================================================>]  520.7MB/520.7MB
1911313536c8: Loading layer [==================================================>]  17.57MB/17.57MB
efb9a1092694: Loading layer [==================================================>]  87.38MB/87.38MB
2ea1378e6b91: Loading layer [==================================================>]  4.608kB/4.608kB
2fcfc4f651ee: Loading layer [==================================================>]  6.677MB/6.677MB
b4e47ec3053a: Loading layer [==================================================>]  9.316MB/9.316MB
Loaded image: python3:v1

启动容器
docker run -ti -d --name python -v /usr/lib/zabbix/alertscripts/:/alertscripts python3:v1

??配置至此,我以为会很顺利的触发动作,发送报警消息。但是每次zabbix主界面显示已发送时,在消息中心都收不到消息。于是开始排错。

??首先,开启详细的日志记录,将日志的等级设置为4。

[root@common]# cat /etc/zabbix/zabbix_server.conf
### Option: DebugLevel
#       Specifies debug level:
#       0 - basic information about starting and stopping of Zabbix processes
#       1 - critical information
#       2 - error information
#       3 - warnings
#       4 - for debugging (produces lots of information)
#       5 - extended debugging (produces even more information)
#
# Mandatory: no
# Range: 0-5
# Default:
DebugLevel=4

发现权限不够,需要在/etc/sudoers文件中为zabbix用户添加命令权限。(如果在zabbix_alert.sh中命令不加绝对路径会提示找不到命令)

日志内容
29074:20190829:093122.148 In zbx_popen() command:'/usr/lib/zabbix/alertscripts/zabbix_alert.sh 'Administrator' 'PROBLEM: Too many processes on Zabbix server' '告警主机:Zabbix server^M
告警时间:2019.08.29 09:30:52^M
告警等级:Warning^M
告警信息: Too many processes on Zabbix server^M
告警项目:proc.num[]^M
问题详情:Number of processes:198^M
当前状态:PROBLEM:198^M
事件ID:122''
 29074:20190829:093122.149 End of zbx_popen():9
 29870:20190829:093122.149 zbx_popen(): executing script
 29074:20190829:093122.155 In zbx_waitpid()
 29074:20190829:093122.155 zbx_waitpid() exited, status:126
 29074:20190829:093122.155 End of zbx_waitpid():29870
 29074:20190829:093122.155 cc.sh output:
/usr/lib/zabbix/alertscripts/zabbix_alert.sh:行5: /usr/bin/docker: 权限不够

 29074:20190829:093122.155 End of execute_action():SUCCEED
 29074:20190829:093122.155 alert ID [44] was sent successfully
 29074:20190829:093122.155 query without transaction detected
 29074:20190829:093122.155 query [txnlev:0] [update alerts set status=1,error='' where alertid=44]
 29084:20190829:093122.156 __zbx_zbx_setproctitle() title:'proxy poller #1 [exchanged data with 0 proxies in 0.000098 sec, exchanging data]'
 
添加zabbix执行命令的权限(一定要关闭selinux,这是一个大坑)
[root@common]# cat /etc/sudoers
## Allow root to run any commands anywhere 
root    ALL=(ALL)       ALL
zabbix  ALL=(root)      NOPASSWD:/usr/bin/docker,/bin/sudo

至此,zabbix向消息中心发送报警信息配置完成。

技术图片

以上是关于zabbix报警(向消息中心发送报警信息)的主要内容,如果未能解决你的问题,请参考以下文章

第五节 实现zabbix报警功能之页面信息报警和页面提示声音报警

zabbix微信报警

zabbix微信报警

zabbix设置邮件发送报警

Zabbix_监控报警无法通过微信发送信息

zabbix-05-报警配置