迁移 / 监控
我们使用 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。
下一次,我们计划处理一份 2023 年的备份,其中包含交换机、路由器、无线 AP 和虚拟机,
并同时测试多模板分配以及 SNMP 团体字符串的处理方式。
- 10 台交换机
- 4 台路由器
- 4 台无线 AP
- 4 台 HyperV 主机 + 10 台虚拟机



