新手必備!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 <username> <password> <dev_ip> <dev_name> getnodes
參數說明:
- <username>: 動環系統登錄用戶名
- <password>: 動環系統登錄密碼
- <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 <username> <password> <dev_ip> <dev_name> <action>")
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技術資料可以關注樂維社區

浙公網安備 33010602011771號