이 시리즈의 인프라는 DEV(개발)와 PRD(운영) 두 환경이 공존합니다. Zabbix 서버는 하나지만 두 환경을 명확히 분리해서 운영해야 합니다. 분리가 느슨하면 운영 알림이 개발 채널로 가거나, 개발 환경의 오탐이 운영 알림과 섞이는 문제가 생깁니다.
이번 편에서는 Zabbix 안에서 DEV/PRD를 분리하는 전체 구조를 다룹니다.
분리 레이어 설계
DEV/PRD 분리는 다섯 개 레이어에서 동시에 이루어집니다:
| 레이어 | DEV | PRD |
|---|---|---|
| 호스트 그룹 | DEV (ID: 26) | PRD (ID: 27) |
| 호스트 이름 | proxmox-cluster | proxmox-cluster-prod |
| API 토큰 | DEV 전용 토큰 | PRD 전용 토큰 |
| 수집 스크립트 | *_collector.py | *_collector_prod.py |
| Slack 채널 | DEV Webhook | PRD Webhook |
각 레이어가 독립적으로 분리되어 있어야 한 환경의 변경이 다른 환경에 영향을 주지 않습니다.
호스트 그룹 분리
Zabbix의 호스트 그룹은 단순한 분류 이상의 역할을 합니다. 권한과 Action 필터의 기준이 됩니다.


그룹 생성 후 각 호스트를 해당 그룹에 배정합니다:
DEV 그룹:
- proxmox-cluster (DEV 클러스터)
- opnsense-hq-01 (HQ 방화벽 — DEV 관리)
- truenas-dev (DEV NAS)
PRD 그룹:
- proxmox-cluster-prod (PRD 클러스터)
- proxmox-prd-cluster (PRD 클러스터 상태)
- opnsense-idc (IDC 방화벽)
- truenas-prd (PRD NAS)
- proxmox-idc-02-ilo (iLO)
- pbs-idc-01-idrac (iDRAC)
Proxmox API 토큰 분리
DEV와 PRD Proxmox 클러스터는 완전히 다른 네트워크 대역에 있고, 각각 별도의 API 토큰을 발급합니다:
# DEV 수집 스크립트
PROXMOX_HOSTS = ["10.0.91.21", "10.0.91.22", "10.0.91.23"]
API_TOKEN = "PVEAPIToken=zabbix-monitor@pve!zabbix=DEV용-UUID"
ZABBIX_HOST = "proxmox-cluster"
# PRD 수집 스크립트
PROXMOX_HOSTS = ["10.0.92.11", "10.0.92.12", "10.0.92.13"]
API_TOKEN = "PVEAPIToken=zabbix-monitor@pve!zabbix=PRD용-UUID"
ZABBIX_HOST = "proxmox-cluster-prod"
토큰이 분리되어 있으면 PRD 토큰이 유출되어도 DEV에는 영향이 없고, DEV 토큰을 교체해도 PRD 수집이 중단되지 않습니다.
수집 스크립트 네이밍 규칙
환경별 스크립트를 구분하는 네이밍 규칙을 일관되게 유지합니다:
proxmox_vm_collector.py # DEV VM
proxmox_vm_collector_prod.py # PRD VM
proxmox_node_collector.py # DEV 노드
proxmox_node_collector_prod.py # PRD 노드
proxmox_cluster_collector.py # DEV 클러스터
proxmox_cluster_collector_prod.py # PRD 클러스터
_prod 접미사 규칙을 일관되게 사용하면 crontab에서 DEV/PRD를 한눈에 구분할 수 있습니다.
Slack 알림 채널 분리
2편에서 설명한 것처럼 DEV와 PRD 각각 별도의 Slack Webhook URL을 발급합니다. Zabbix에서는 이를 두 개의 Media Type으로 등록합니다:
| Media Type 이름 | Webhook URL | 상태 |
|---|---|---|
| Slack Webhook (DEV) | DEV 채널 URL | Enabled |
| Slack Webhook (PRD) | PRD 채널 URL | Enabled |
Media Type 생성 후 반드시 Enabled 상태 확인 — 기본값이 Disabled이기 때문입니다. (2편 참조)
Action으로 알림 라우팅
Action의 Conditions에서 호스트 그룹을 필터로 사용해 DEV/PRD 알림을 분리합니다:


DEV Action 설정:
Conditions 탭:
- Host group = DEV
- Trigger severity >= Warning
Operations 탭:
- Send to users: Admin
- Send only to: Slack Webhook (DEV)
PRD Action 설정:
Conditions 탭:
- Host group = PRD
- Trigger severity >= Warning
Operations 탭:
- Send to users: Admin
- Send only to: Slack Webhook (PRD)
이렇게 하면 DEV 그룹 호스트의 트리거는 DEV 채널로, PRD 그룹 호스트의 트리거는 PRD 채널로 자동 라우팅됩니다.
사용자 권한 분리
외부 팀원이나 협력업체에게 특정 환경의 조회 권한만 부여할 때 호스트 그룹 기반 권한을 활용합니다:


| 사용자 그룹 | 접근 가능 호스트 그룹 | 권한 |
|---|---|---|
| DEV-Viewers | DEV | Read |
| PRD-Viewers | PRD | Read |
| Admins | DEV + PRD | Read-Write |
User group에 호스트 그룹 권한을 설정하면, 해당 그룹 소속 사용자는 지정된 호스트만 볼 수 있습니다.
호스트 이름 네이밍 규칙
호스트 이름만 봐도 어느 환경인지 알 수 있도록 일관된 규칙을 정합니다:
# DEV 환경
proxmox-cluster # DEV 클러스터 노드용
proxmox-dev-cluster # DEV 클러스터 상태용
truenas-dev # DEV NAS
# PRD 환경
proxmox-cluster-prod # PRD 클러스터 노드용
proxmox-prd-cluster # PRD 클러스터 상태용
truenas-prd # PRD NAS
proxmox-idc-02-ilo # IDC 서버 02 iLO
pbs-idc-01-idrac # IDC PBS 서버 iDRAC
-dev, -prd, -prod 접미사를 일관되게 붙이면 Zabbix 대시보드에서 환경 구분이 쉬워집니다.
로그 파일 분리
수집 스크립트 로그도 환경별로 분리합니다:
# DEV
>> /data/zabbix/scripts/collector.log
>> /data/zabbix/scripts/collector_node.log
>> /data/zabbix/scripts/collector_cluster.log
# PRD
>> /data/zabbix/scripts/collector_prod.log
>> /data/zabbix/scripts/collector_node_prod.log
>> /data/zabbix/scripts/collector_cluster_prod.log
로그 분리의 이점:
- PRD 스크립트 오류가 DEV 로그에 섞이지 않음
tail -f collector_prod.log로 PRD만 실시간 모니터링 가능- 로그 크기 관리가 수월함
DEV 환경에서만 다르게 처리하는 항목
DEV와 PRD가 구조는 같지만 세부 처리가 다른 경우가 있습니다.
디스크 Health UNKNOWN 처리:
PRD 노드는 실제 SAS/SATA 디스크가 있어 Health가 OK 또는 degraded로 명확하지만, DEV 노드는 일부 디스크가 논리 볼륨(LOGICAL_VOLUME)으로 UNKNOWN을 반환합니다.
# PRD: UNKNOWN을 이상(1)으로 처리해도 무방
health_val = 0 if health_str == "OK" else 1
# DEV: UNKNOWN은 -1로 처리해 오탐 방지
health_val = 0 if health_str == "OK" else (1 if health_str != "UNKNOWN" else -1)
이처럼 DEV에서는 오탐을 유발할 수 있는 항목의 임계값을 더 느슨하게 설정합니다.
트러블슈팅: 잘못된 채널로 알림이 가는 경우
분리 설정 후에도 알림이 잘못된 채널로 가는 경우가 있습니다. 원인별 확인 방법:
1. 호스트가 잘못된 그룹에 있는 경우

2. Action의 Host group 조건이 빠진 경우
> [Alerts > Actions > 해당 Action > Conditions 탭 확인]
3. User Media에 두 채널이 모두 등록된 경우
User Media에 DEV와 PRD Webhook이 둘 다 등록되어 있고, Action의 Send only to 설정이 없으면 두 채널 모두에 발송됩니다.
> [Alerts > Actions > Operations > Send only to 값 확인]
마치며
이번 편에서 다룬 핵심 포인트입니다:
- 호스트 그룹이 권한과 Action 필터의 기준 — 반드시 정확히 분류
- API 토큰, 스크립트, 로그를 환경별로 분리해 독립성 확보
- Action의
Host group조건 +Send only to조합으로 알림 채널 정확히 분리 - DEV는 오탐 방지를 위해 일부 임계값을 느슨하게 설정
- 호스트 이름에
-dev/-prd규칙을 일관되게 적용
다음 편은 이 시리즈의 마지막으로, 실제 운영 중 마주친 오탐·누락·설정 오류를 모아 정리합니다.