Migration / Monitoring
Claude Code を使って PRTG の UPS 監視定義を
30 分で Zabbix へ移行してみた #
バックアップファイル 1 個を渡すだけ。API サーバー不要、スクリプトをゼロから書く必要もなし。
AI エージェントに丸投げしたら本当に動いた話。
PRTG
Zabbix
APC UPS
SNMP
Python
なぜ PRTG から Zabbix へ? #
弊社ではPRTG Network Monitor を使って一部区画の UPS(無停電電源装置)を SNMP 監視してきた。
安定していたし特に不満もなかったのだが、センサー数のライセンス上限に近づいてきたことと、
コストの見直しを機に Zabbix への移行を検討することになった。
Zabbix はオープンソースでホスト数・メトリクス数が無制限。Grafana との公式プラグインも充実している。
移行しない理由がない。問題は 「移行作業そのもの」 だ。
デバイス数が多いと手作業での再設定は数日がかりになる。
そこで今回は Claude Code を使ってみた。
PRTG のバックアップファイルをそのまま渡し、解析からスクリプト生成・実行まで丸投げする。
結果、約 30 分で 12 台すべての移行が完了した。ただし 1 つつまずきポイントがあったので、その話も含めて記録しておく。
今回の移行対象 #
PRTG のバックアップ(PRTG Configuration.dat)を解析すると、こんな構成だった。
Zabbix には「
APC UPS by SNMP」というテンプレートが標準で用意されており、ほぼそのまま使えるはずだった(「はずだった」という伏線)。
移行アーキテクチャ #
通常の移行では PRTG の API サーバーが稼働している必要があるが、今回は バックアップファイルに直接アクセスする方法 を採った。.dat ファイルの実態はただの XML なので、サーバー不要でオフラインでも解析できる。
PRTG Configuration.dat (XML ファイル)
│
▼ Claude Code に渡すだけ
┌─────────────────────────┐
│ Claude Code │
│ ① XML を解析 │
│ ② デバイス一覧を抽出 │
│ ③ Python スクリプト生成 │
│ ④ Zabbix API 実行 │
└─────────────────────────┘
│
▼
Zabbix(ホスト・インターフェース・テンプレート登録完了)実際の作業ログ #
Claude Code に渡した指示 #
ターミナルで claude を起動し、以下の一文を投げた。
PRTG のバックアップファイルを解析して Zabbix に移行してほしい。
ファイル: ./PRTG\ Configuration.dat
手順:
1. XML を解析して全デバイス一覧(名前・IP・センサー種別)を CSV に出力
2. デバイス一覧を確認して移行計画をサマリーして
3. Zabbix API(http://zabbix.example.local)を使って以下を実行:
- ホストグループ「Migrated-UPS」を作成
- 各デバイスを SNMP インターフェース(port 161)で登録
- テンプレートを適用
4. インポート結果を確認して差分レポートを出力して
Zabbix API トークン: xxxxxxxxxxxxxxxxStep ① XML 解析・デバイス抽出(約 5 分) #
Claude Code はすぐに PRTG Configuration.dat を読み込み、Python で XML を解析するスクリプトを自動生成・実行した。
デバイス名、IP アドレス、センサー種別が CSV に出力されるまで 5 分もかからなかった。
import xml.etree.ElementTree as ET
import csv, re
with open("PRTG Configuration.dat", encoding="utf-8-sig") as f:
content = f.read()
# デバイス名・IP・センサー種別を正規表現で抽出
devices = re.findall(
r'<name[^>]*>\s*([A-Za-z0-9_\-\.]+(?:-ups-\d+|UPS-\d+)[^<]*)\s*</n',
content
)
# CSV 出力
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"])Step ② 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")
# ホストグループ作成
group_id = zabbix_call("hostgroup.create", {"name": HOST_GROUP})["groupids"][0]
# テンプレート ID 取得
tmpl = zabbix_call("template.get", {"filter": {"host": [TEMPLATE]}})
tmpl_id = tmpl[0]["templateid"]
# CSV を読み込んでホスト登録
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 のアラート画面が真っ赤になった。
「Input voltage too high」が 12 台全台から一斉に発報。
「APC UPS by SNMP」にはいくつかバリアントがあり、今回適用されたものが海外の 200V 系機器向け設定になっていた。
今回移行の環境は 100V 系なので、閾値がそのまま適用されてアラートが誤発報していた。
修正指示を出して登録し直し #
Claude Code に追加指示を出した。
電圧異常のアラートが出ている。
適用したテンプレートが 200V 系の設定になっているようだ。
以下の対応をしてほしい:
1. 全 12 台のホストからテンプレートをいったんアンリンク
2. 正しいテンプレート「APC UPS by SNMP(100V)」を検索して適用
※ 存在しない場合は既存テンプレートを複製して
入力電圧トリガーの閾値を 90〜110V に修正したものを作成して適用
3. アラートが解消されたか確認して結果を報告してClaude Code はテンプレートのアンリンク → 閾値修正 → 再適用を自動で実施。
この修正作業も含めて、最初のインポートから 15 分以内に解消した。
「APC UPS by SNMP」と一口に言っても電圧系の閾値設定が異なる場合がある。
次回からは
template.get でテンプレート一覧を取得・確認してから指定するよう指示に含める。結果まとめ #
自動化できたこと・できなかったこと #
自動化できた
- XML バックアップからのデバイス一覧抽出
- ホスト名・IP・インターフェース登録
- ホストグループへの振り分け
- テンプレートの適用・差し替え
- インポート後の差分チェック
手動対応が必要だった
- テンプレート選定(電圧仕様の確認)
- アラート通知ルールの再設定
- ダッシュボード・マップの再作成
- 過去データの移行(今回は対象外)
Claude Code を使ってよかった点 #
- コードを書いてその場で実行してくれる
従来の AI チャットは「コードを生成 → 貼り付けて実行 → エラーを貼り付けて再聞き」のループが必要だった。
Claude Code はターミナル上でそのまま実行し、エラーが出れば自分で読んで修正してくれる。 - API ドキュメントを自分で確認する
「Zabbix API で SNMP インターフェースを登録するパラメーターは?」を自分で調べてくれる。
仕様書を読む手間がほぼゼロだった。 - 「何ができないか」を正直に伝えてくれる
PRTG 固有のセンサー設定の完全移行を頼んだとき、
「Zabbix との概念の違いから 1:1 移行は難しい。この部分は手動推奨」と適切に線引きしてくれた。 - 失敗しても修正指示 1 行で立て直せる
テンプレート問題も「修正して」の一言で対応。
デバッグのストレスがほぼない。
次回予告:ネットワーク機器編 #
今回は全台 APC UPS という「同一構成」だったため、移行がスムーズだった。
次回は スイッチ・ルーター・無線 AP・仮想マシン が混在する 2023 年のバックアップを使い、
複数テンプレートへの振り分けや SNMP コミュニティ文字列の扱いも含めて試してみる予定だ。
- スイッチ 10 台
- ルーター 4 台
- 無線 AP 4 台
- HyperV ホスト 4 台 + 仮想マシン 10 台



