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报警(向消息中心发送报警信息)的主要内容,如果未能解决你的问题,请参考以下文章