新手必备!Zabbix接入动环并监控教程

本指南将手把手教您如何通过API将动环系统接入Zabbix监控平台,实现机房环境7×24小时智能监控。即使您是Zabbix新手,也能在1小时内完成基础监控。

一、为什么要将动环系统接入Zabbix?

动环系统(动力环境监控系统)负责监测机房的:
温度/湿度 📊
电力供应 ⚡
空调运行 ❄️
安防状态 🔒
漏水检测 💧
传统监控痛点:
1、独立系统需要单独登录查看
2、告警分散在不同平台
3、历史数据难以分析
4、无法与其他IT设备联动监控

二、接入Zabbix的核心优势

在这里插入图片描述
消除监控孤岛:将动环数据与其他IT设备(服务器/网络/存储)统一监控
单点管理:一个控制台查看所有基础设施状态
统一权限体系:复用现有账号权限管理系统

三、如何进行监控?

脚本功能概述
此Python脚本实现了从动环系统获取设备数据并自动发送到Zabbix监控平台的完整流程。主要功能包括:
1.登录动环系统获取认证会话
2.查询指定设备ID的监控数据
3.将数据写入临时文件
4.使用zabbix_sender工具发送数据到Zabbix服务器
环境准备
1.安装Python 3.x
2.安装必要的Python库:
pip install requests
3.确保zabbix_sender工具已安装并可用

1、下面是一个示例动环监控的整个流程图在这里插入图片描述
请求登录获取会话的接口时,会返回一个PHPSESSID(分别对应着动环系统里不通的设备名),在根据获取到的ID去请求数据,每个动环系统的请求方式都不一定是一样的,可以具体根据对应产商提供的API接口说明文档去进行适配。下面是我获取的ID并做了映射,会根据清晰明了。在这里插入图片描述
2、通过动环提供的API接口获取到的ID读取的数据,下面是一个示例在这里插入图片描述
3、把获取的到数据进行调整最终输出为一个临时文本文件,然后在通过zabbix_sender把数据根据对应给予的键值推送到平台对应的zabbix采集器监控项中,推送的键值要和监控项的创建的键值一致,具体可以参考网上的zabbix采集器监控项运用教程。
四、使用步骤,下面是一个参考脚本,仅供参考!

  1. 执行脚本
    python3 donghuan_to_zabbix.py <dev_ip> <dev_name> getnodes
    参数说明:
    : 动环系统登录用户名
    : 动环系统登录密码
    <dev_ip>: 动环系统服务器IP地址
    <dev_name>: Zabbix中配置的主机名称

  2. 示例执行命令
    python3 donghuan_to_zabbix.py admin password123 192.168.1.100 Donghuan_Main getnodes

    import requests
    import subprocess
    import json
    import os
    import sys

    配置

    IDS = [1594, 1598, 1595, 1586, 1598, 1593, 1596, 1591, 1599, 1589]
    KEY_PREFIX = “device.data.”
    TEMP_DIR = “/tmp/donghuan”
    AUTO_DISCOVERY_FILE = os.path.join(TEMP_DIR, “zabbix_auto_discovery.json”)

    设备ID与名称的映射

    DEVICE_NAMES = {
    1586: “1号精密空调”,
    1589: “2号配电柜”,
    1591: “2号精密空调”,
    1593: “3号精密空调”,
    1594: “3号配电柜”,
    1595: “市电输入”,
    1596: “环境监控”,
    1598: “UPS主机”,
    1599: “1号配电柜”
    }

    def login_and_get_session(dev_ip, username, password):
    “”“登录服务器并返回会话对象”“”
    login_url = f"http://{dev_ip}/action/ajax/login_ajax.php"
    session = requests.Session()
    response = session.get(login_url, params={“uname”: username, “pwd”: password, “checked”: “1”})
    if response.status_code == 200:
    cookies = session.cookies.get_dict()
    if “PHPSESSID” in cookies:
    print(“登录成功,已获取PHPSESSID。”)
    return session
    print(“登录失败。”)
    exit(1)

    def fetch_device_data(session, dev_ip, device_id):
    “”“获取特定设备ID的数据”“”
    data_url = f"http://{dev_ip}/action/devicePage/ajaxGetData.php?id={device_id}"
    response = session.get(data_url)
    if response.status_code == 200:
    data = response.json().get(‘datas’, {})
    if data:
    return {
    “updatetime”: data.get(‘rd_updatetime’, “”),
    “innertemp”: data.get(‘rd_air_innertemp’, “”),
    “innerhum”: data.get(‘rd_air_innerhum’, “”),
    “state”: data.get(‘rd_air_state’, “”),
    “temp_alarm”: data.get(‘rd_air_temphalarm’, “0”), # 温度报警
    “hum_alarm”: data.get(‘rd_air_humhalarm’, “0”), # 湿度报警
    “temp_setpoint”: data.get(‘rd_air_tempsetpoint’, “”),
    “hum_setpoint”: data.get(‘rd_air_humsetpoint’, “”)
    }
    print(f"获取ID为{device_id}的设备数据失败")
    return None

    def write_device_data_to_file(device_name, device_data):
    “”“将设备数据写入文件,以设备名称命名文件”“”
    if not os.path.exists(TEMP_DIR):
    os.makedirs(TEMP_DIR)

     file_path = os.path.join(TEMP_DIR, f"{device_name}.txt")  # 使用设备名称命名文件
     with open(file_path, 'w') as f:
         json.dump(device_data, f, indent=4, ensure_ascii=False)
     return file_path
    

    def process_and_send_data(file_path, dev_name, device_id):
    “”“处理数据并发送到Zabbix”“”
    with open(file_path, ‘r’) as f:
    device_data = json.load(f)

     zabbix_commands = [
         f"zabbix_sender -z {dev_name} -s {dev_name} -k {KEY_PREFIX}updatetime[{device_id}] -o {device_data['updatetime']}",
         f"zabbix_sender -z {dev_name} -s {dev_name} -k {KEY_PREFIX}innertemp[{device_id}] -o {device_data['innertemp']}",
         f"zabbix_sender -z {dev_name} -s {dev_name} -k {KEY_PREFIX}innerhum[{device_id}] -o {device_data['innerhum']}",
         f"zabbix_sender -z {dev_name} -s {dev_name} -k {KEY_PREFIX}state[{device_id}] -o {device_data['state']}",
         f"zabbix_sender -z {dev_name} -s {dev_name} -k {KEY_PREFIX}temp_alarm[{device_id}] -o {device_data['temp_alarm']}",  # 温度报警
         f"zabbix_sender -z {dev_name} -s {dev_name} -k {KEY_PREFIX}hum_alarm[{device_id}] -o {device_data['hum_alarm']}",    # 湿度报警
         f"zabbix_sender -z {dev_name} -s {dev_name} -k {KEY_PREFIX}temp_setpoint[{device_id}] -o {device_data['temp_setpoint']}",  # 温度设定值
         f"zabbix_sender -z {dev_name} -s {dev_name} -k {KEY_PREFIX}hum_setpoint[{device_id}] -o {device_data['hum_setpoint']}"   # 湿度设定值
     ]
    
     for command in zabbix_commands:
         subprocess.run(command, shell=True, check=True)
    

    def main():
    if len(sys.argv) < 5:
    print(“用法: script.py <dev_ip> <dev_name> ”)
    sys.exit(1)

     username = sys.argv[1]
     password = sys.argv[2]
     dev_ip = sys.argv[3]
     dev_name = sys.argv[4]
     action = sys.argv[5]
    
     session = login_and_get_session(dev_ip, username, password)
    
     if action == 'getnodes':
         for device_id in IDS:
             # 获取设备名称
             device_name = DEVICE_NAMES.get(device_id)
             if not device_name:
                 print(f"设备ID {device_id} 无对应名称,跳过此设备。")
                 continue
    
             device_data = fetch_device_data(session, dev_ip, device_id)
             if not device_data:
                 continue
    
             # 将设备数据写入文件,以设备名称命名
             file_path = write_device_data_to_file(device_name, device_data)
             process_and_send_data(file_path, dev_name, device_id)
    

    if name == “main”:
    main()

更多zabbix教程,可以关注乐维社区,更有在线答疑免费解答。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值