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配置
新建报警媒介类型
按图示的内容添加后,保存。图中有3个参数,分别表示报名的收件人,消息主题,消息内容。
在报警媒介类型的列表页,可以进行发送测试
报警媒介类型绑定到用户
选中要绑定到的用户,然后新建
需要注意的是,修改用户权限,如果该用户没有指定主机/主机群的操作权限,那么是无法触发报警消息的。至少要有读的权限。
添加监控项
添加触发器
添加动作
创建动作
定义报警操作
这里,消息内容可以使用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服务后,根据上文中设置的报警机制,会先生成问题。,可以在监测-》仪表盘和监测-》问题中查看。
点击左侧的时间,可以看到详情:
查看动作日志: