从零开始构建报警中心:part03 python脚本设计
  qdp7fV9qUjiK 2023年11月19日 47 0

脚本设计功能要点

在经过前两篇从零开始构建报警中心:part01 使用python脚本接收zabbix报警信息-1  从零开始构建报警中心:part02 使用python脚本接收zabbix报警信息-2 的演示后,在本篇要实现一个全功能的脚本,实现的功能主要有以下几项:

  • 接收数据,并进行格式化处理
  • 本地日志记录数据
  • 接收端异常使用钉钉报警通知

zabbix动作消息格式优化

在之前的文档中可以得知,在设定了动作后,报警媒介中的两个宏{ALERT.SUBJECT} {ALERT.MESSAGE}会作为脚本参数传递给脚本。而这两个宏的值,既可以使用动作中默认值,也可以自主设定。

从零开始构建报警中心:part03 python脚本设计_json

如果需要自定义可以自助修改默认标题和消息内容,如果需要需要对单独的操作进行发送单独的操作,可以取消点选内容信息同样可以进行自定义内容操作。

由于这个信息是要传递给未来编写的server端,由报警中心的server端对一个报警的整个生命周期进行操作,所以“操作”与“恢复操作”都要做相应的修改。

需要注意的是,这里的消息内容,如图所示:

从零开始构建报警中心:part03 python脚本设计_python脚本_02


需要额外注意他的格式。由于大部分代码运行在linux环境下,需要注意换行符,如果不经过处理会出现^M ,在Unix或Linux系统中,文本文件中的每一行结尾通常只包含换行符(\n)。而在Windows系统中,每行结尾通常包含两个字符:换行符(\n)和回车符(\r)。如下图所示

从零开始构建报警中心:part03 python脚本设计_json_03

为了避免这种情况前列建议将消息内容进行一定的处理,尽量处理成json字符串的格式,这样做的目的有两个:

  1. 方便处理换行符问题
  2. 格式化文本更方便向后端传递

基于这两点,可以将消息内容简化修改,消息内容处理成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}"}

从零开始构建报警中心:part03 python脚本设计_python脚本_04

经过上述配置,python脚本接收到的参数就会按照如图所示。为了测试,可以将一台主机的zabbix-agent暂停,来看一下具体的报警信息是什么(测试环境操作),如图所示,以下是信息是python脚本接收到的信息。

从零开始构建报警中心:part03 python脚本设计_json_05

报警媒介脚本优化

传递给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

测试

使用报警媒介测试

从零开始构建报警中心:part03 python脚本设计_python脚本_06

server端响应

从零开始构建报警中心:part03 python脚本设计_json_07


钉钉报警

未完待续


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月19日 0

暂无评论

推荐阅读
  m33FiQF5dk1h   2023年11月13日   18   0   0 重启IISjson
  0C74k909wmgc   2023年11月13日   19   0   0 pythonjson
  hs9CtFCuSvuL   2023年11月19日   17   0   0 DatabaseHCLjson
  EeGZtZT5Jsfk   2023年11月13日   16   0   0 请求头jsoncurl
qdp7fV9qUjiK