Claude Code を使って PRTG の UPS 監視定義を 30 分で Zabbix へ移行してみた

Claude Code を使って PRTG の UPS 監視定義を 30 分で Zabbix へ移行してみた

2 min read

Migration / Monitoring

Claude Code を使って PRTG の UPS 監視定義を
30 分で Zabbix へ移行してみた #

バックアップファイル 1 個を渡すだけ。API サーバー不要、スクリプトをゼロから書く必要もなし。
AI エージェントに丸投げしたら本当に動いた話。

Claude Code
PRTG
Zabbix
APC UPS
SNMP
Python

なぜ PRTG から Zabbix へ? #

弊社ではPRTG Network Monitor を使って一部区画の UPS(無停電電源装置)を SNMP 監視してきた。
安定していたし特に不満もなかったのだが、センサー数のライセンス上限に近づいてきたことと、
コストの見直しを機に Zabbix への移行を検討することになった。

Zabbix はオープンソースでホスト数・メトリクス数が無制限。Grafana との公式プラグインも充実している。
移行しない理由がない。問題は 「移行作業そのもの」 だ。

PRTG → Zabbix のワンクリック移行ツールは存在しない。
デバイス数が多いと手作業での再設定は数日がかりになる。

そこで今回は Claude Code を使ってみた。
PRTG のバックアップファイルをそのまま渡し、解析からスクリプト生成・実行まで丸投げする。
結果、約 30 分で 12 台すべての移行が完了した。ただし 1 つつまずきポイントがあったので、その話も含めて記録しておく。

今回の移行対象 #

PRTG のバックアップ(PRTG Configuration.dat)を解析すると、こんな構成だった。

監視対象

APC UPS × 12 台 #

全台が APC 製 UPS。監視方式も SNMP で統一されていた。

センサー構成

118 センサー #

Ping、UPS ヘルス、バッテリー残量・温度・電圧、
トラフィック、HTTP 死活監視など。

全台が同一メーカー・同一プロトコルというのが今回のポイント。
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 トークン: xxxxxxxxxxxxxxxx

Step ① 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 台全台から一斉に発報。

原因:テンプレートの電圧閾値が 200V 仕様だった。
「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 でテンプレート一覧を取得・確認してから指定するよう指示に含める。

結果まとめ #

作業時間

合計 約 30 分 #

手作業なら半日〜1 日はかかる作業。
修正対応(テンプレート問題)込みでもこの時間。

移行結果

12 台・118 センサー 移行完了 #

エラーゼロ。アラートも修正後は正常。
PRTG と並行稼働で確認後に切り替え。

自動化できたこと・できなかったこと #

✅ 自動化できた

  • XML バックアップからのデバイス一覧抽出
  • ホスト名・IP・インターフェース登録
  • ホストグループへの振り分け
  • テンプレートの適用・差し替え
  • インポート後の差分チェック

❌ 手動対応が必要だった

  • テンプレート選定(電圧仕様の確認)
  • アラート通知ルールの再設定
  • ダッシュボード・マップの再作成
  • 過去データの移行(今回は対象外)

Claude Code を使ってよかった点 #

  1. コードを書いてその場で実行してくれる
    従来の AI チャットは「コードを生成 → 貼り付けて実行 → エラーを貼り付けて再聞き」のループが必要だった。
    Claude Code はターミナル上でそのまま実行し、エラーが出れば自分で読んで修正してくれる。
  2. API ドキュメントを自分で確認する
    「Zabbix API で SNMP インターフェースを登録するパラメーターは?」を自分で調べてくれる。
    仕様書を読む手間がほぼゼロだった。
  3. 「何ができないか」を正直に伝えてくれる
    PRTG 固有のセンサー設定の完全移行を頼んだとき、
    「Zabbix との概念の違いから 1:1 移行は難しい。この部分は手動推奨」と適切に線引きしてくれた。
  4. 失敗しても修正指示 1 行で立て直せる
    テンプレート問題も「修正して」の一言で対応。
    デバッグのストレスがほぼない。

次回予告:ネットワーク機器編 #

今回は全台 APC UPS という「同一構成」だったため、移行がスムーズだった。
次回は スイッチ・ルーター・無線 AP・仮想マシン が混在する 2023 年のバックアップを使い、
複数テンプレートへの振り分けや SNMP コミュニティ文字列の扱いも含めて試してみる予定だ。

  • スイッチ 10 台
  • ルーター 4 台
  • 無線 AP 4 台
  • HyperV ホスト 4 台 + 仮想マシン 10 台
使用ツール:Claude Code(Anthropic) / Zabbix 7.x / PRTG Network Monitor 26.x
作業環境:Windows 11 + Ubuntu 24.04 (WSL2)
※ 記事中のホスト名・IP アドレスはすべてマスク処理済みです。
Updated on 2026年4月21日

What are your feelings

  • Happy
  • Normal
  • Sad