---
title: Claude Code를 사용하여 PRTG의 UPS 모니터링 정의를 30분 만에 Zabbix로 마이그레이션해 보았습니다
description: "마이그레이션 / 모니터링 # Claude Code를 사용해 PRTG의 UPS 모니터링 정의를 30분 만에 Zabbix로 마이그레이션해 본 이야기 백업 파일 1개만 건네주면 끝. API 서버 불필요, 스크립트를 처음부터 작성할 필요도 없음. AI 에이전트에게 맡겼더니 정말로 작동한 이야기. Claude Code PRTG Zabbix…"
url: "https://bestnetllc.co.jp/ko/docs/claude-code%eb%a5%bc-%ec%82%ac%ec%9a%a9%ed%95%98%ec%97%ac-prtg%ec%9d%98-ups-%eb%aa%a8%eb%8b%88%ed%84%b0%eb%a7%81-%ec%a0%95%ec%9d%98%eb%a5%bc-30%eb%b6%84-%eb%a7%8c%ec%97%90-zabbix%eb%a1%9c-%eb%a7%88/"
updated: "2026-10-19"
category: Tech Blog
---

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

마이그레이션 / 모니터링

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

 [![](https://bestnetllc.co.jp/wp-content/uploads/2026/04/blog_01_prompt.jpg)](https://bestnetllc.co.jp/wp-content/uploads/2026/04/blog_01_prompt.jpg)

### Step ① XML 파싱·장치 추출(약 5분)

Claude Code는 즉시 `PRTG Configuration.dat`을 읽어들여 Python으로 XML을 파싱하는 스크립트를 자동 생성·실행했다.
장치 이름, IP 주소, 센서 종류가 CSV로 출력되기까지 5분도 걸리지 않았다.

 [![](https://bestnetllc.co.jp/wp-content/uploads/2026/04/blog_02_working.jpg)](https://bestnetllc.co.jp/wp-content/uploads/2026/04/blog_02_working.jpg)

```
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의 최대 강점이다.

 [![](https://bestnetllc.co.jp/wp-content/uploads/2026/04/blog_04_result.jpg)](https://bestnetllc.co.jp/wp-content/uploads/2026/04/blog_04_result.jpg)

```
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}],
        })
```

## ![⚠️](https://s.w.org/images/core/emoji/17.0.2/svg/26a0.svg) 주의할 점: 전압 이상 알림이 대량 발생

가져오기 직후 Zabbix 알림 화면이 빨갛게 변했다.
**“Input voltage too high”가 12대 전체에서 일제히 발생.**

 **원인: 템플릿의 전압 임계값이 200V 사양이었다.**
“APC UPS by SNMP”에는 몇 가지 변형이 있으며, 이번에 적용된 것이 해외 200V 계열 기기용 설정이었다.
이번 이전 환경은 100V 계열이므로 임계값이 그대로 적용되어 알림이 오발령되고 있었다.

### 수정 지시를 내려 다시 등록

Claude Code에 추가 지시를 내렸다.

 [![](https://bestnetllc.co.jp/wp-content/uploads/2026/04/blog_05_dialog.jpg)](https://bestnetllc.co.jp/wp-content/uploads/2026/04/blog_05_dialog.jpg)

```
전압 이상 알림이 발생하고 있다.
적용한 템플릿이 200V 계열 설정으로 되어 있는 것 같다.

다음 대응을 해주기 바란다:
1. 전체 12대 호스트에서 템플릿을 일단 연결 해제
2. 올바른 템플릿 “APC UPS by SNMP(100V)”를 검색하여 적용
   ※ 존재하지 않는 경우 기존 템플릿을 복제하여
     입력 전압 트리거 임계값을 90~110V로 수정한 것을 생성하여 적용
3. 알림이 해소되었는지 확인하고 결과를 보고해 줘
```

Claude Code는 템플릿 연결 해제 → 임계값 수정 → 재적용을 자동으로 실시했다.
**이 수정 작업도 포함하여 최초 임포트부터 15분 이내에 해결했다.**

 **배움: 템플릿은 사전에 명시적으로 지정해야 한다.**
“APC UPS by SNMP”라고 해도 전압 계열 임계값 설정이 다를 수 있다.
다음부터는 `template.get`으로 템플릿 목록을 취득·확인한 후 지정하도록 지시에 포함시킨다.

## 결과 정리

 [![](https://bestnetllc.co.jp/wp-content/uploads/2026/04/blog_04_result.jpg)](https://bestnetllc.co.jp/wp-content/uploads/2026/04/blog_04_result.jpg)

작업 시간

### 합계 약 30분

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

이관 결과

### 12대·118개 센서 이관 완료

오류 제로. 알림도 수정 후 정상.
PRTG와 병행 가동으로 확인 후 전환.

### 자동화할 수 있었던 것과 없었던 것

![✅](https://s.w.org/images/core/emoji/17.0.2/svg/2705.svg) 자동화할 수 있었던 것

- XML 백업에서 장치 목록 추출
- 호스트명·IP·인터페이스 등록
- 호스트 그룹으로 분류
- 템플릿 적용·교체
- 임포트 후 차이 확인

![❌](https://s.w.org/images/core/emoji/17.0.2/svg/274c.svg) 수동 대응이 필요했던 것

- 템플릿 선정(전압 사양 확인)
- 알림 통지 규칙 재설정
- 대시보드·맵 재작성
- 과거 데이터 이관(이번은 대상 외)

## 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 주소는 모두 마스킹 처리되었습니다.
