zabbix Server端配置脚本

将脚本放到/usr/lib/zabbix/alertscripts目录下,同时需要添加可执行权限:

#!python3.6
# -*- coding: utf-8 -*-
'''
@File  : server.py
@Author: zhm
@Date  : 2019-09-25
@Desc  : zabbix
'''

import requests
import json
import sys
import smtplib
import time
from email.mime.text import MIMEText

# print(sys.argv[0])  # 脚本路径
# print(sys.argv[1])  # 传入的参数-发送人
# print(sys.argv[2])  # 传入的参数- 主题
# print(sys.argv[3])  # 传入的参数- 问题具体参数


def writeLog(str):
    # 写入日志
    localTime = time.localtime(time.time())
    localTimeStrs = time.strftime("%Y-%m-%d %H:%M:%S", localTime)
    fw = open('/usr/lib/zabbix/alertscripts/log', 'a+')
    fw.write(localTimeStrs + ': ' + str + '\r\n')
    fw.flush()
    fw.close()


def sendMsgPost(url, param):
    # 参数
    # data = {'key': '4b6ce82fbe554a11b99dabfa3a4ae6d9', 'info': 'This is a info', 'userid': 'jxn'}
    # 格式化
    # param = json.dumps(data)
    # 调用接口
    headers = {"Content-Type": "application/json", "Accept": "application/json"}
    return requests.post(url, data=json.dumps(param), headers=headers)


def sendMsgForGet(url, param):
    # 接口路径
    # url = 'http://www.tuling123.com/openapi/api'
    # 参数
    # param = {'wd': 'python'}
    # 调用接口
    return requests.get(url, params=param)


def sendEmail(emailsubject, emailmessage, emailUrl):
    # 设置服务器所需信息
    # 163邮箱服务器地址
    mail_host = 'smtp.163.com'
    # 163用户名
    mail_user = '********'
    # 密码(部分邮箱为授权码)
    mail_pass = '*******'
    # 邮件发送方邮箱地址
    sender = '********'
    # 邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发
    receivers = [emailUrl]

    # 设置email信息
    # 邮件内容设置
    message = MIMEText(emailmessage, 'plain', 'utf-8')  # 注意这里,如果不把content内容改掉,很可能被126认为是垃圾邮件,不允许发送
    # 邮件主题
    message['Subject'] = emailsubject  # 同内容
    # 发送方信息
    message['From'] = sender
    # 接受方信息
    message['To'] = receivers[0]

    # 登录并发送邮件
    try:
        smtpObj = smtplib.SMTP()
        # 连接到服务器
        smtpObj.connect(mail_host, 25)
        # 登录到服务器
        smtpObj.login(mail_user, mail_pass)
        # 发送
        smtpObj.sendmail(
            sender, receivers, message.as_string())
        # 退出
        smtpObj.quit()
        print('success')
    except smtplib.SMTPException as e:
        print('error', e)  # 打印错误


# 接口路径
# url = "http://192.168.4.24:9599/gaeaapi/logic/Server/test?path=I%3A%5CGuotongCode%5CBase_Logic%5Csrc%5C5.Service%5CGaea.Logic.Boot%5Csrc%5Cmain%5Cresources%5CServer.py"

# 传参写入日志
writeLog(json.dumps(sys.argv))

# 分析参数,写入服务器状态
argv3 = json.loads(sys.argv[3])
# argv3 = "{\r\n\"HostName\": \"agent-4.200\",\r\n\"Severity\": \"Not classified\",\r\n\"TriggerName\": \"PCPing\",\r\n\"TriggerStatus\": \"OK\",\r\n\"ProblemID\": \"640\"\r\n}"
actionArgv = json.loads(sys.argv[3])

# 调用接口,写入状态
# param = {}
# param['hostname'] = actionArgv['HostName']
# if actionArgv['TriggerStatus'] == 'OK':
#     param['status'] = 1
# else:
#     param['status'] = 0
# res = sendMsgPost(url, param)
# print(res.status_code)
# print(res.text)

# 发送邮件
# 从参数中获取邮件地址,没有的话,发送到默认邮箱
if actionArgv['sendtype'] == 'email':
    emailUrl = actionArgv['sendpath']
else:
    emailUrl = '**********' # 默认邮箱地址
emailsubject = sys.argv[2]
emailmessage = sys.argv[3]
sendEmail(emailsubject, emailmessage, emailUrl)

其中要用到发送邮件,所以,需要先安装python的email包:

pip install --upgrade pip
wget https://pypi.python.org/packages/bb/35/0aa85e06fc14fe86d4064f18ad05254ebc649e81235faf96d591b02158e9/email-6.0.0a1.tar.gz
tar zxvf email-6.0.0a1.tar.gz
cd email-6.0.0a1
python3.6 setup.py install
pip3 install mail

Zabbix配置

新建报警媒介类型

zabbix 执行脚本 解析数据 zabbix定时执行脚本_json


按图示的内容添加后,保存。图中有3个参数,分别表示报名的收件人,消息主题,消息内容。

在报警媒介类型的列表页,可以进行发送测试

zabbix 执行脚本 解析数据 zabbix定时执行脚本_服务器_02

报警媒介类型绑定到用户

选中要绑定到的用户,然后新建

zabbix 执行脚本 解析数据 zabbix定时执行脚本_json_03


需要注意的是,修改用户权限,如果该用户没有指定主机/主机群的操作权限,那么是无法触发报警消息的。至少要有读的权限。

zabbix 执行脚本 解析数据 zabbix定时执行脚本_zabbix 执行脚本 解析数据_04

添加监控项

zabbix 执行脚本 解析数据 zabbix定时执行脚本_python_05

添加触发器

zabbix 执行脚本 解析数据 zabbix定时执行脚本_服务器_06

添加动作

创建动作

zabbix 执行脚本 解析数据 zabbix定时执行脚本_zabbix 执行脚本 解析数据_07


定义报警操作

zabbix 执行脚本 解析数据 zabbix定时执行脚本_python_08


这里,消息内容可以使用json的写法,方便脚本中解析内容:

{
"HostName": "{HOST.NAME}",
"Severity": "{TRIGGER.SEVERITY}",
"TriggerName": "{TRIGGER.NAME}",
"TriggerStatus": "{TRIGGER.STATUS}",
"ProblemID": "{EVENT.ID}",
"userid":"1",
"usrgrp":"1",
"sendtype":"email",
"sendpath":"*****"
}

消息内置参数:

故障:{TRIGGER.STATUS},服务器:{HOSTNAME1}发生:{TRIGGER.NAME}故障! 
告警主机:{HOSTNAME1},IP地址:{HOST.CONN} 
告警时间:{EVENT.DATE}{EVENT.TIME} 
告警等级:{TRIGGER.SEVERITY} 
告警信息:{TRIGGER.NAME} 
告警项目:{TRIGGER.KEY1} 
问题详情:{ITEM.NAME}:{ITEM.VALUE} 
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1} 
事件ID:{EVENT.ID} 

恢复:{TRIGGER.STATUS},服务器:{HOSTNAME1}已经恢复!:{TRIGGER.NAME} 
告警主机:{HOSTNAME1} ,IP地址:{HOST.CONN} 
告警时间:{EVENT.DATE}{EVENT.TIME} 
告警等级:{TRIGGER.SEVERITY} 
告警信息:{TRIGGER.NAME} 
告警项目:{TRIGGER.KEY1} 
问题详情:{ITEM.NAME}:{ITEM.VALUE} 
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1} 
事件ID:{EVENT.ID}

主机显示名:{HOST.NAME}

测试

打开日志

tailf  /var/log/zabbix/zabbix_server.log

如果有错误,会在日志里面显示出来。但如果是用户权限不足,发送不了报警消息,日志里面是看不出来的。需要调整日志等级。

查看问题

停止客户端的zabbix-agent服务后,根据上文中设置的报警机制,会先生成问题。,可以在监测-》仪表盘和监测-》问题中查看。

zabbix 执行脚本 解析数据 zabbix定时执行脚本_zabbix 执行脚本 解析数据_09


点击左侧的时间,可以看到详情:

zabbix 执行脚本 解析数据 zabbix定时执行脚本_python_10

查看动作日志:

zabbix 执行脚本 解析数据 zabbix定时执行脚本_python_11