脚本设计功能要点
在经过前两篇从零开始构建报警中心:part01 使用python脚本接收zabbix报警信息-1 从零开始构建报警中心:part02 使用python脚本接收zabbix报警信息-2 的演示后,在本篇要实现一个全功能的脚本,实现的功能主要有以下几项:
- 接收数据,并进行格式化处理
- 本地日志记录数据
- 接收端异常使用钉钉报警通知
zabbix动作消息格式优化
在之前的文档中可以得知,在设定了动作后,报警媒介中的两个宏{ALERT.SUBJECT}{ALERT.MESSAGE}会作为脚本参数传递给脚本。而这两个宏的值,既可以使用动作中默认值,也可以自主设定。
如果需要自定义可以自助修改默认标题和消息内容,如果需要需要对单独的操作进行发送单独的操作,可以取消点选内容信息同样可以进行自定义内容操作。
由于这个信息是要传递给未来编写的server端,由报警中心的server端对一个报警的整个生命周期进行操作,所以“操作”与“恢复操作”都要做相应的修改。
需要注意的是,这里的消息内容,如图所示:
需要额外注意他的格式。由于大部分代码运行在linux环境下,需要注意换行符,如果不经过处理会出现^M ,在Unix或Linux系统中,文本文件中的每一行结尾通常只包服务器托管网含换行符(n)。而在Windows系统中,每行结尾通常包含两个字符:换行符(n)和回车符(r)。如下图所示
为了避免这种情况前列建议将消息内容进行一定的处理,尽量处理成json字符串的格式,这样做的目的有两个:
- 方便处理换行符问题
- 格式化文本更方便向后端传递
基于这两点,可以将消息内容简化修改,消息内容处理成json字符串,忽略换行,缩减到一行内处理。为了简化处理
{"mstype":"warn","hostname": "{HOSTNAME1}","trigger_name": "{TRIGGER.NAME}","trigger_serverity": "{TRIGGER.SEVERITY}","event_time": "{EVENT.DATE} {EVENT.TIME}","trigger_key": "{TRIGGER.KEY1}" ,"value": '{ITEM.LASTVALUE}' , "ip": "{HOST.IP}" ,"event_id": "{EVENT.ID}","trigger_status": "{TRIGGER.STATUS}"}
经过上述配置,python脚本接收到的参数就会按照如图所示。为了测试,可以将一台主机的zabbix-agent暂停,来服务器托管网看一下具体的报警信息是什么(测试环境操作),如图所示,以下是信息是python脚本接收到的信息。
报警媒介脚本优化
传递给python的参数为字符串格式,根据上图可以发现,改字符串很容易的转换为字典格式,也可以直接作为jason串直接传递给报警中心。
经过修正,Python脚本可以修改如下:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
该脚本部署在zabbix-server服务器上,
用于接收zabbix报警信息,
然后将信息格式化发送给alertcenter
"""
import datetime
import sys
import json
import requests
def log(info):
"""
将报警信息写入日志文件,日志记录到/tmp/log.txt文件中
"""
current_time = datetime.datetime.now()
timestamp = current_time.strftime("%Y-%m-%d %H:%M:%S")
with open("/tmp/log.txt", "a") as log_file:
log_file.write(f"{timestamp} {info}n")
def send(send_url, send_message):
"""
将信息格式化发送给alertcenter
"""
try:
r = requests.post(send_url, data=message,headers={"Content-Type": "application/json"})
log("requests 请求已发出" + str(r))
except Exception as E:
log(str(E))
if __name__ == "__main__":
# 获取命令行参数
subject = sys.argv[1] # 这个subject几乎可以忽略
message = sys.argv[2] # 息内容信息已经相对足够了,包含了事件的时间、IP、主机名等信息
log(subject+'|' + message)
url = "http://127.0.0.1:8888/alert_test"
send(url, message)
报警中心代码demo
接受信息的报警中心代码使用以一个简单的demo来完成
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/alert_test', methods=['POST'])
def alert_test():
data = request.get_json()
print(str(data))
return jsonify({"message": "Success! Received data: " + str(data)})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8888)
运行报警中心示例代码
python test.py
测试
使用报警媒介测试
server端响应
钉钉报警
未完待续
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: node版本问题:Error: error:0308010C:digital envelope routines::unsupported
前言 出现这个错误是因为 node.js V17及以后版本中最近发布的OpenSSL3.0, 而OpenSSL3.0对允许算法和密钥大小增加了严格的限制,可能会对生态系统造成一些影响. 在node.js V17以前一些可以正常运行的的应用程序,但是在 V1…