---
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-hans/docs/%e4%bd%bf%e7%94%a8-claude-code-%e5%9c%a8-30-%e5%88%86%e9%92%9f%e5%86%85%e5%b0%86-prtg-%e7%9a%84-ups-%e7%9b%91%e6%8e%a7%e5%ae%9a%e4%b9%89%e8%bf%81%e7%a7%bb%e5%88%b0-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。
下一次，我们计划处理一份 2023 年的备份，其中包含**交换机、路由器、无线 AP 和虚拟机，**
并同时测试多模板分配以及 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 地址均已进行掩码处理。
