码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-08-30 19:03:52      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:safari   web   int   object   ble   proc   alert   ike   生产环境   

一、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报警(向消息中心发送报警信息)

标签:safari   web   int   object   ble   proc   alert   ike   生产环境   

原文地址:https://www.cnblogs.com/wangyajian/p/11436238.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!