Claude Code를 사용하여 PRTG의 UPS 모니터링 정의를 30분 만에 Zabbix로 마이그레이션해 보았습니다

Claude Code를 사용하여 PRTG의 UPS 모니터링 정의를 30분 만에 Zabbix로 마이그레이션해 보았습니다

4 min read

마이그레이션 / 모니터링

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분 #

수작업이라면 반나절~하루는 걸릴 작업.
수정 대응(템플릿 문제) 포함해도 이 시간.

이관 결과

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年6月9日

What are your feelings

  • Happy
  • Normal
  • Sad