---
title: 使用 Claude Code 在 30 分鐘內將 PRTG 的 UPS 監控定義遷移至 Zabbix
description: "遷移 / 監控 # 我們使用 Claude Code， 在 30 分鐘內將 PRTG 的 UPS 監控定義遷移至 Zabbix 只需提供一份備份檔案。不需要架設 API 伺服器，也不必從零開始撰寫腳本。 我們把工作交給 AI 代理，結果它真的做到了。 Claude Code PRTG Zabbix APC UPS SNMP Python ## 為什麼要從 PRTG 遷移至 Zabbix？ 我們一直使用 **PRTG Network Monitor**，透過 SNMP 監控機房內部分…"
url: "https://bestnetllc.co.jp/zh-hant/docs/%e4%bd%bf%e7%94%a8-claude-code-%e5%9c%a8-30-%e5%88%86%e9%90%98%e5%85%a7%e5%b0%87-prtg-%e7%9a%84-ups-%e7%9b%a3%e6%8e%a7%e5%ae%9a%e7%be%a9%e9%81%b7%e7%a7%bb%e8%87%b3-zabbix/"
updated: "2026-06-08"
category: Tech Blog
---

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

遷移 / 監控

# 我們使用 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
```

 [![](https://bestnetllc.co.jp/wp-content/uploads/2026/04/blog_01_prompt.jpg)](https://bestnetllc.co.jp/wp-content/uploads/2026/04/blog_01_prompt.jpg)

### 步驟①：XML 解析與設備擷取（約 5 分鐘）

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

 [![](https://bestnetllc.co.jp/wp-content/uploads/2026/04/blog_02_working.jpg)](https://bestnetllc.co.jp/wp-content/uploads/2026/04/blog_02_working.jpg)

```
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 最大的優勢。

 [![](https://bestnetllc.co.jp/wp-content/uploads/2026/04/blog_04_result.jpg)](https://bestnetllc.co.jp/wp-content/uploads/2026/04/blog_04_result.jpg)

```
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}],
        })
```

## ![⚠️](https://s.w.org/images/core/emoji/17.0.2/svg/26a0.svg) 遇到的小插曲：電壓異常警報大量觸發

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

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

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

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

 [![](https://bestnetllc.co.jp/wp-content/uploads/2026/04/blog_05_dialog.jpg)](https://bestnetllc.co.jp/wp-content/uploads/2026/04/blog_05_dialog.jpg)

```
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` 取得並確認範本清單，再進行指定。

## 成果摘要

 [![](https://bestnetllc.co.jp/wp-content/uploads/2026/04/blog_04_result.jpg)](https://bestnetllc.co.jp/wp-content/uploads/2026/04/blog_04_result.jpg)

作業時間

### 總計約 30 分鐘

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

遷移結果

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

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

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

![✅](https://s.w.org/images/core/emoji/17.0.2/svg/2705.svg) 可自動化的部分

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

![❌](https://s.w.org/images/core/emoji/17.0.2/svg/274c.svg) 需要人工介入的部分

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

## 使用 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 位址皆已遮罩處理。
