使用 Claude Code 在 30 分鐘內將 PRTG 的 UPS 監控定義遷移至 Zabbix

使用 Claude Code 在 30 分鐘內將 PRTG 的 UPS 監控定義遷移至 Zabbix

4 min read

遷移 / 監控

我們使用 Claude Code,
在 30 分鐘內將 PRTG 的 UPS 監控定義遷移至 Zabbix #

只需提供一份備份檔案。不需要架設 API 伺服器,也不必從零開始撰寫腳本。
我們把工作交給 AI 代理,結果它真的做到了。

Claude Code
PRTG
Zabbix
APC UPS
SNMP
Python

為什麼要從 PRTG 遷移至 Zabbix? #

我們一直使用 PRTG Network Monitor,透過 SNMP 監控機房內部分 UPS(不斷電系統)設備。
運作穩定,也沒有特別的不滿,但隨著感測器數量逐漸逼近授權上限,
加上進行成本檢討之後,我們決定考慮遷移至 Zabbix。

Zabbix 是開放原始碼軟體,主機與監控項目數量沒有上限,還提供豐富的官方外掛程式,並可與 Grafana 搭配使用。
沒有理由不遷移。問題在於遷移作業本身。

目前並不存在可一鍵完成 PRTG → Zabbix 遷移的工具。
設備數量一多,手動重新設定往往要花上好幾天。

這次我們嘗試使用 Claude Code。
我們直接把 PRTG 備份檔案交給它,從解析、腳本產生到執行全部交由它處理。
結果,全部 12 台設備的遷移在約 30 分鐘內就完成了。不過過程中也遇到一個小插曲,所以一併記錄下來。

本次的遷移範圍 #

分析 PRTG 備份檔(PRTG Configuration.dat)之後,我們確認了以下設定內容。

監控設備

12 台 APC UPS #

所有設備皆為 APC 製造的 UPS,監控方式統一採用 SNMP。

感測器設定

118 個感測器 #

Ping、UPS 健康狀態、電池剩餘容量、溫度、電壓、
流量、HTTP 可用性監控等。

所有設備都來自同一家製造商、使用相同通訊協定,這是這次的關鍵。
Zabbix 內建了一個名為 APC UPS by SNMP 的標準範本,
照理說應該幾乎可以直接套用(請注意這個「應該」——這正是伏筆)。

遷移架構 #

一般的遷移方式需要讓 PRTG API 伺服器保持運作,但這次我們採用了直接存取備份檔案的做法。
.dat 檔案本質上只是 XML,因此不需要伺服器也能離線解析。

PRTG Configuration.dat  (XML file)
        │
        ▼  Pass to Claude Code only
  ┌─────────────────────────┐
  │      Claude Code        │
  │  ① Parse XML            │
  │  ② Extract device list  │
  │  ③ Generate Python script│
  │  ④ Execute Zabbix API   │
  └─────────────────────────┘
        │
        ▼
  Zabbix(Host, Interface, Template registration complete)

實際作業紀錄 #

給 Claude Code 的指示 #

我們在終端機啟動 claude,並下達了以下這一則指示。

Please analyze the PRTG backup file and migrate it to Zabbix.

File: ./PRTG\ Configuration.dat

Steps:
1. Parse XML and output all device list (name, IP, sensor type) to CSV
2. Review device list, provide migration plan summary
3. Use Zabbix API (http://zabbix.example.local) to execute the following:
   - Create host group "Migrated-UPS"
   - Register each device with SNMP interface (port 161)
   - Apply templates
4. Verify import results and output difference report

Zabbix API token: xxxxxxxxxxxxxxxx

步驟①:XML 解析與設備擷取(約 5 分鐘) #

Claude Code 立即讀取了 PRTG Configuration.dat 檔案,並自動產生並執行了用於解析 XML 的 Python 腳本。
不到 5 分鐘就把設備名稱、IP 位址與感測器類型輸出成 CSV。

import xml.etree.ElementTree as ET
import csv, re

with open("PRTG Configuration.dat", encoding="utf-8-sig") as f:
    content = f.read()

# Extract device name, IP, sensor type via regex
devices = re.findall(
    r'<name[^>]*>\s*([A-Za-z0-9_\-\.]+(?:-ups-\d+|UPS-\d+)[^<]*)\s*</n',
    content
)

# CSV output
with open("prtg_export.csv", "w", newline="") as f:
    w = csv.writer(f)
    w.writerow(["name", "ip", "interface_type"])
    for name, ip in zip(device_names, device_ips):
        w.writerow([name, ip, "SNMP"])

步驟②:Zabbix 匯入腳本產生與執行(約 10 分鐘) #

CSV 準備好之後,Claude Code 接著產生並立即執行了呼叫 Zabbix API 的匯入腳本。
完全不需要手動複製貼上程式碼、再自行除錯。這正是 Claude Code 最大的優勢。

import requests, csv, json

ZABBIX_URL  = "http://zabbix.example.local/api_jsonrpc.php"
API_TOKEN   = "xxxxxxxxxxxxxxxx"
TEMPLATE    = "APC UPS by SNMP"
HOST_GROUP  = "Migrated-UPS"

def zabbix_call(method, params):
    payload = {"jsonrpc": "2.0", "method": method,
               "params": params, "id": 1,
               "auth": API_TOKEN}
    r = requests.post(ZABBIX_URL, json=payload)
    return r.json().get("result")

# Create host group
group_id = zabbix_call("hostgroup.create", {"name": HOST_GROUP})["groupids"][0]

# Get template ID
tmpl = zabbix_call("template.get", {"filter": {"host": [TEMPLATE]}})
tmpl_id = tmpl[0]["templateid"]

# Read CSV and register hosts
with open("prtg_export.csv") as f:
    for row in csv.DictReader(f):
        zabbix_call("host.create", {
            "host": row["name"],
            "interfaces": [{"type": 2,  # SNMP
                            "main": 1, "useip": 1,
                            "ip": row["ip"], "dns": "",
                            "port": "161"}],
            "groups":    [{"groupid": group_id}],
            "templates": [{"templateid": tmpl_id}],
        })

⚠️ 遇到的小插曲:電壓異常警報大量觸發 #

匯入完成後沒多久,Zabbix 的警報畫面立刻一片通紅。
「輸入電壓過高」在全部 12 台設備上同時觸發。

根本原因:範本的電壓閾值是依照 200V 規格設定的。
「APC UPS by SNMP」存在好幾個變體,這次套用到的版本,其實是為海外的 200V 設備所設定。
本次遷移的環境使用的是 100V 系統,因此套用的閾值觸發了誤報。

問題修正指示與重新註冊 #

我們對 Claude Code 下達了追加指示。

Voltage anomaly alerts are being triggered.
The applied template appears to be in 200V system settings.

Please perform the following:
1. Unlink the template from all 12 hosts
2. Search for the correct template "APC UPS by SNMP (100V)" and apply it
   ※ If it doesn't exist, duplicate the existing template,
     modify the input voltage trigger thresholds to 90-110V, and apply it
3. Confirm the alerts have been resolved and report the results

Claude Code 自動執行了範本解除連結 → 閾值修正 → 重新套用的流程。
包含最初的匯入作業在內,這次修正在 15 分鐘內就解決了。

教訓:範本應事先明確指定。
即使同樣叫做「APC UPS by SNMP」,電壓相關指標的閾值設定也可能不同。
下次我們會在指示中加入一個步驟:先用 template.get 取得並確認範本清單,再進行指定。

成果摘要 #

作業時間

總計約 30 分鐘 #

若手動作業,通常需要半天到一整天的時間。
包含修正作業(範本問題)在內,這次仍然控制在這個時間範圍內。

遷移結果

12 台設備、118 個感測器遷移完成 #

零錯誤。修正後警報恢復正常。
切換前先與 PRTG 並行運作以進行驗證。

哪些能自動化、哪些不能 #

✅ 可自動化的部分

  • 從 XML 備份中擷取設備清單
  • 主機名稱、IP 與介面的註冊
  • 分配至主機群組
  • 範本的套用與替換
  • 匯入後的差異檢查

❌ 需要人工介入的部分

  • 範本選擇(電壓規格確認)
  • 警報通知規則的重新設定
  • 儀表板與地圖的重新建立
  • 歷史資料遷移(本次不在範圍內)

使用 Claude Code 的優點 #

  1. 程式碼當場產生並執行。
    傳統的 AI 對話模式,往往需要反覆進行「產生程式碼 → 貼上執行 → 貼上錯誤訊息再次詢問」的循環。
    Claude Code 直接在終端機上執行,自行讀取錯誤訊息並加以修正。
  2. 會自行查證 API 文件。
    當我們詢問「透過 Zabbix API 註冊 SNMP 介面需要哪些參數?」時,它會自行進行調查。
    閱讀規格文件的成本幾乎為零。
  3. 誠實地說明自己做不到的事。
    當我們要求將 PRTG 特有的感測器設定完整 1:1 遷移時,
    它適當地劃清了界線:「由於與 Zabbix 在概念上的差異,1:1 遷移有困難,建議這部分改用人工作業。」
  4. 只要一行修正指示,就能從失敗中恢復。
    範本問題只靠一句「請修正這個」就解決了。
    幾乎沒有任何除錯壓力。

下次預告:網路設備篇 #

這次之所以進行順利,是因為所有設備都是「相同設定」的 APC UPS。
下次我們計畫使用一份包含交換器、路由器、無線 AP 與虛擬機器的 2023 年備份,
同時測試多範本分配與 SNMP 社群字串的處理方式。

  • 10 台交換器
  • 4 台路由器
  • 4 台無線 AP
  • 4 台 HyperV 主機 + 10 台虛擬機器
使用工具:Claude Code(Anthropic)/ Zabbix 7.x / PRTG Network Monitor 26.x
作業環境:Windows 11 + Ubuntu 24.04(WSL2)
※ 本文中的所有主機名稱與 IP 位址皆已遮罩處理。
Updated on 2026年6月9日

What are your feelings

  • Happy
  • Normal
  • Sad

©2020 BESTNET.LLC . All Rights Reserved.