遷移 / 監控
我們使用 Claude Code,
在 30 分鐘內將 PRTG 的 UPS 監控定義遷移至 Zabbix #
只需提供一份備份檔案。不需要架設 API 伺服器,也不必從零開始撰寫腳本。
我們把工作交給 AI 代理,結果它真的做到了。
PRTG
Zabbix
APC UPS
SNMP
Python
為什麼要從 PRTG 遷移至 Zabbix? #
我們一直使用 PRTG Network Monitor,透過 SNMP 監控機房內部分 UPS(不斷電系統)設備。
運作穩定,也沒有特別的不滿,但隨著感測器數量逐漸逼近授權上限,
加上進行成本檢討之後,我們決定考慮遷移至 Zabbix。
Zabbix 是開放原始碼軟體,主機與監控項目數量沒有上限,還提供豐富的官方外掛程式,並可與 Grafana 搭配使用。
沒有理由不遷移。問題在於遷移作業本身。
設備數量一多,手動重新設定往往要花上好幾天。
這次我們嘗試使用 Claude Code。
我們直接把 PRTG 備份檔案交給它,從解析、腳本產生到執行全部交由它處理。
結果,全部 12 台設備的遷移在約 30 分鐘內就完成了。不過過程中也遇到一個小插曲,所以一併記錄下來。
本次的遷移範圍 #
分析 PRTG 備份檔(PRTG Configuration.dat)之後,我們確認了以下設定內容。
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 台設備上同時觸發。
「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 resultsClaude Code 自動執行了範本解除連結 → 閾值修正 → 重新套用的流程。
包含最初的匯入作業在內,這次修正在 15 分鐘內就解決了。
即使同樣叫做「APC UPS by SNMP」,電壓相關指標的閾值設定也可能不同。
下次我們會在指示中加入一個步驟:先用
template.get 取得並確認範本清單,再進行指定。成果摘要 #
哪些能自動化、哪些不能 #
可自動化的部分
- 從 XML 備份中擷取設備清單
- 主機名稱、IP 與介面的註冊
- 分配至主機群組
- 範本的套用與替換
- 匯入後的差異檢查
需要人工介入的部分
- 範本選擇(電壓規格確認)
- 警報通知規則的重新設定
- 儀表板與地圖的重新建立
- 歷史資料遷移(本次不在範圍內)
使用 Claude Code 的優點 #
- 程式碼當場產生並執行。
傳統的 AI 對話模式,往往需要反覆進行「產生程式碼 → 貼上執行 → 貼上錯誤訊息再次詢問」的循環。
Claude Code 直接在終端機上執行,自行讀取錯誤訊息並加以修正。 - 會自行查證 API 文件。
當我們詢問「透過 Zabbix API 註冊 SNMP 介面需要哪些參數?」時,它會自行進行調查。
閱讀規格文件的成本幾乎為零。 - 誠實地說明自己做不到的事。
當我們要求將 PRTG 特有的感測器設定完整 1:1 遷移時,
它適當地劃清了界線:「由於與 Zabbix 在概念上的差異,1:1 遷移有困難,建議這部分改用人工作業。」 - 只要一行修正指示,就能從失敗中恢復。
範本問題只靠一句「請修正這個」就解決了。
幾乎沒有任何除錯壓力。
下次預告:網路設備篇 #
這次之所以進行順利,是因為所有設備都是「相同設定」的 APC UPS。
下次我們計畫使用一份包含交換器、路由器、無線 AP 與虛擬機器的 2023 年備份,
同時測試多範本分配與 SNMP 社群字串的處理方式。
- 10 台交換器
- 4 台路由器
- 4 台無線 AP
- 4 台 HyperV 主機 + 10 台虛擬機器



