오픈소스 인사이트
home
오픈소스 기술 동향
home

Zabbix 연동 - Custom 이벤트 핸들링

들어가며

Zabbix는 서버, 네트워크, 애플리케이션 등 IT 인프라의 성능과 상태를 실시간으로 모니터링하고 관리하는 오픈 소스 기반의 IT 모니터링 솔루션입니다.
사용자는 Zabbix를 통해 장애 상황을 신속하게 감지하고, 데이터를 수집하여 시각적으로 확인할 수 있으며, 장애 발생 시 알림을 받아 문제를 해결할 수 있습니다.
장애, 경고 등의 이벤트는 Zabbix WebUI에서 확인했음을 체크(Ack)하고, 해결되었으면 종료(Close)할 수 있습니다.
Zabbix WebUI가 아닌 다른 통합 관리 시스템에서 이벤트를 관리 하고 싶다면 어떻게 하면 될까요?
이글에서는 Zabbix의 특정 이벤트를 외부로 전달하고, 외부에서 Zabbix 이벤트를 확인하고, 확인했음을 체크(Ack)하는것을 간단하게 구현해 보겠습니다.

이벤트 처리 과정

1.
Zabbix에서 이벤트가 생성됩니다.
2.
Zabbix 서버는 이벤트가 Action의 조건을 만족하는지 확인합니다. 조건을 만족하면 Action에 정의된 Operations을 수행합니다.
3.
Operations는 Custom 스크립트를 수행하게 설정 되어 있습니다. 전달할 이벤트 정보를 스크립트의 파라미터로 전달합니다.
4.
Custom 스크립트는 이벤트를 확인하고, API를 사용하여 이벤트를 확인했음을 체크합니다.

스크립트 설정

1. Alert>Scripts 메뉴에서 스크립트를 생성합니다.  이벤트 ID를 파라미터로 전달합니다.
2. Alerts>Actions>Trigger actions 에서 Action을 추가합니다.
원하는 이벤트이면 Operation이 실행되도록 설정합니다.
Operations에서 Script를 실행하도록 설정합니다.
3. 설정 완료 되었습니다. 조건을 만족하는 이벤트가 발생 하면 Script가 실행 됩니다.

스크립트 작성

Zabbix에서는 json-rpc 형태의 API를 제공합니다.
이 글에서는 Zabbix 공식 Python 라이브러리인 zabbix_utils을 사용하여 이벤트를 처리합니다.
1. API를 호출하기 위해서 Admin 사용자로 로그인 하여 User>API tokens 화면에서  API 토큰을 생성합니다.
반드시 Admin사용자일 필요는 없지만 해당 이벤트에 대한 접근 권한이 있는 사용자이어야 합니다.
토큰은 다시 조회할 수 없으므로 복사해 두어야 합니다.
2. zabbix_utils 패키지를 설치합니다.
$ pip install zabbix_utils
Plain Text
복사
3. zabbix_server.conf의  ExternalScripts 설정(기본값: /usr/lib/zabbix/externalscripts) 디렉토리 아래에 스크립트를 생성합니다.
- /usr/lib/zabbix/externalscripts/ack_event.py
#!/usr/bin/env python3 import sys import re import logging from zabbix_utils import ZabbixAPI ZABBIX_URL = "http://127.0.0.1/zabbix" ZABBIX_TOKEN = "" # 생성한 API 토큰 복사 logging.basicConfig( filename="/var/log/zabbix/script_log", level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s" ) if __name__ == "__main__": eventId = sys.argv[1:2][0] api = ZabbixAPI(url=ZABBIX_URL) api.login(token=ZABBIX_TOKEN) event = api.event.get(eventids=[eventId]) logging.info(event) api.event.acknowledge(eventids=[event[0]["eventid"]], action=2) logging.info("ack " + event[0]["eventid"]) event = api.event.get(eventids=[eventId]) logging.info(event)
C
복사
API에 관한 자세한 정보는 매뉴얼을 참조하시면 됩니다.
스크립트는 zabbix ID로 동작하므로 스크립트의 소유자는 zabbix로 변경하고,
스크립트에서 접근하는 파일들이 zabbix ID로  접근 권한이 있는지 확인해야 합니다.
# chown zabbix:zabbix /usr/lib/zabbix/externalscripts/ack_event.py # ls -l /usr/lib/zabbix/externalscripts/ack_event.py -rwxr-xr-x 1 zabbix zabbix 776 1027 21:10 /usr/lib/zabbix/externalscripts/ack_event.py # ls -l /var/log/zabbix/script_log -rw-rw-r–. l zabbix zabbix 1456 Sep 2 17:01 /var/log/zabbix/script_log
C
복사
4. 이벤트를 발생시키고 스크립트에서 생성한 로그를 확인합니다.
# tail -f /var/log/zabbix/script_log 2025-10-17 20:53:02,945 [INFO] [{'eventid': '325639', 'source': '0', 'object': '0', 'objectid': '24085', 'clock': '1760701982', 'value': '1', 'acknowledged': '0', 'ns': '840749059', 'name': 'fileGetTrigger', 'severity': '0', 'r_eventid': '0', 'c_eventid': '0', 'correlationid': '0', 'userid': '0', 'cause_eventid': '0', 'opdata': '', 'suppressed': '0', 'urls': []}] 2025-10-17 20:53:02,952 [INFO] ack 325639 2025-10-17 20:53:02,957 [INFO] [{'eventid': '325639', 'source': '0', 'object': '0', 'objectid': '24085', 'clock': '1760701982', 'value': '1', 'acknowledged': '1', 'ns': '840749059', 'name': 'fileGetTrigger', 'severity': '0', 'r_eventid': '0', 'c_eventid': '0', 'correlationid': '0', 'userid': '0', 'cause_eventid': '0', 'opdata': '', 'suppressed': '0', 'urls': []}]
C
복사

마치며

Zabbix에서 발생한 이벤트를 Custom 스크립트로 전달하고, 이 스크립트에서는 이벤트를 확인하고 처리하는 코드를 작성해 보았습니다.
이것을 확장하면 Zabbix 이벤트를 별도의 통합 관리 환경에서 처리할 수 있습니다.

레퍼런스

김유성 프로
에스코어㈜ 소프트웨어사업부 OSS사업팀
Kubernetes , Istio 기술 지원을 하였으며, 현재는 Zabbix 기술 지원을 하고 있습니다.