使用 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。
下一次,我们计划处理一份 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 地址均已进行掩码处理。
Updated on 2026年6月9日

What are your feelings

  • Happy
  • 常规
  • Sad

©2020 BESTNET.LLC . All Rights Reserved.