작성자: 주인장 디지문
(http://www.digimoon.net/)

 Zabbix는 alarm 송신 수단으로 Email, Jabber, SMS, Scripts를 지원한다. Script type을 이용하면 Telegram으로도 alarm을 받을 수 있다. SMS는 Zabbix Server에 GSM modem이 serial cable 등으로 연결되어 있다면 사용 가능하나 요즘 대부분의 SMS는 API기반으로 제공되므로 SMS를 구현하려면 Scripts type을 적극 사용해야 할 것이다.
 일반적으로 alarm 송신 설정을 위해서는 아래의 과정을 거친다. 본 문서에서는 Zabbix Server에 특정 user group과 user를 생성하지 않고 기본 제공되는 admin 계정으로 진행하는 방법을 다룬다.

Step 1) Zabbix Server에 user group을 생성하여 이 group에 관리대상 장비들을 할당 (이 관리대상 장비들은 template, item, trigger 설정을 마친 장비들에 한정한다)

Step 2) 생성된 user group에 신규/기존 user를 할당

Step 3) media 생성 (SMS, Email, Script 등)

Step 4) user가 media에 액세스하도록 설정

Step 5) action 설정을 통해 특정 이벤트 시 특정 user/user group 이 특정 media를 이용해 alarm 받도록 설정


Email alarm 송신 설정


Step 1) Administration -> Media types 설정
사용자 삽입 이미지

Step 2) Name필드에서 기본값으로 제공되는 Email을 클릭하거나, 우측 상단 Create media type 클릭
Step 3) 자신이 사용하는 SMTP 서버 정보를 입력한다. 보내는 SMTP 서버 정보를 입력해야 한다.
사용자 삽입 이미지

파라미터

설정

Name

원하는 Media Name을 선택 (: Email)

Type

Email

SMTP server

보내는 SMTP 서버 주소를 입력

(: mail.foobar.com)

SMTP server port

SMTP 서버가 사용하는 포트 입력

(: 25)

SMTP helo

SMTP server와 동일하게 입력

(: mail.foobar.com)

SMTP email

SMTP 서버에 인증 액세스할 수 있는,  @를 포함한 Email 주소 입력 (: user@foobar.com)

Connection security

SMTP 서버 정보에 맞게 입력 (: None)

Authentication

SMTP 서버 정보에 맞게 입력 (: None)

Username

SMTP 서버를 사용하는 Email 계정 이름이나 @를 포함한 Email 주소 입력
(
: user 또는 user@foobar.com)

Password

Email 계정의 패스워드 입력

Enabled

V 체크


다 입력했으면 최하단 Update 눌러 적용
사용자 삽입 이미지
Step 4) 만든 Media를 User에게 할당
Adminisration -> Users -> Alias 필드에서 원하는 User -> Media 탭-> Add
사용자 삽입 이미지

파라미터

설정

Type

앞의 Media Type에서 만들었던 MediaName들이 펼침메뉴로 제공된다.
(
: Email)

Send to

Alarm을 수신할 메일주소를 입력한다. Media 만들 당시 입력했던 SMTP서버와는 무관하므로 원하는 메일주소를 자유롭게 입력
 (
: customer@foobar.com)

When active

기본값 그대로 사용

Use if severity

Alarm을 받기 원하는 severity를 선택

(: 모두 선택)

Enabled

V 체크



Step 5) Action 설정
 본 챕터에서는 Action을 alarm 용도로만 설명할 것이나 Action은 alarm 외에도 디스커버리된 시스템을 자동 등록하거나 이벤트 발생 시 원하는 동작을 구현하고 싶을 때에도 쓰인다.
Configuration -> Actions -> 기본값으로 “Report problems to Zabbix administrators” Action이 Disabled 상태로 생성되어 있다. 이를 그대로 사용해도 되나 본 문서에서는 신규 Action을 생성하는 방법을 설명한다. ->우측 상단 “Event source” 드롭다운 메뉴에서 “Triggers” 선택하고 Create action 클릭
사용자 삽입 이미지

여기까지 진행하였으면 4가지 sub tab menu가 확인될 것이다.
사용자 삽입 이미지
먼저 Action을 설정한다. 이 메뉴에서는 뒤에 설명할 Operations, Recovery operations의 조건을 설정한다.

파라미터

설정

Name

원하는 Action 이름을 입력
(
: Report problems to Zabbix administrators by Email)

Conditions

아래 New condition을 통해 만든 conditon이 나열된다. 삭제를 원하면 우측 Remove 클릭

<strong참고문서>$2
https://www.zabbix.com/documentation/3.4/manual/config/notifications/action/conditions

New condition

본 문서에서는 어떤 장비이든지 특정 Trigger 이벤트 발생하면 모두 원하는 Action이 일어나도록(여기서는 alarm) 하는 설정을 할 것이다. 왼쪽 드롭다운 메뉴에서 Trigger severity 선택, 중간 드롭다운 메뉴의 연산자로는 >= 선택, 맨 오른쪽 드롭다운 메뉴에서 Select 선택한다.

사용자 삽입 이미지

Add 클릭하여 Conditions 에 포함시킨다.

Enabled

V 체크


Add를 한 뒤의 설정 모습
사용자 삽입 이미지
다음 Sub tab 메뉴 “Operations”을 설정한다. Operations에는 sub tab menu ”Action”에서 정의한 조건 발생 시 어떤 동작을 할 지 설정한다. 모든 입력창의 내용은 기본값 그대로 사용해도 무방하다.
Operations

파라미터

설정

Default operation step duration

1h

Default subject

이벤트 수신 내용의 제목 형식을 설정한다. 기본값 그대로 사용

Problem: {TRIGGER.NAME}

Default message

이벤트 수신 내용의 상세 메시지 형식을 설정한다. 기본값 그대로 사용

Problem started at {EVENT.TIME} on {EVENT.DATE}

Problem name: {TRIGGER.NAME}

Host: {HOST.NAME}

Severity: {TRIGGER.SEVERITY}

 

Original problem ID: {EVENT.ID}

{TRIGGER.URL}

Pause operations while in maintenance

V 체크

Operation details

New 클릭

사용자 삽입 이미지

 

Steps : 기본값 사용 (1-1)
Step duration :
기본값 사용 (0)
Operation type : Send message
선택
Send to User groups,  Send to Users :
본 챕터에서는 admin useralarm 설정을 설명하고 있으므로 아래 두 설정 중 택일한다.
 Send to User groups
 : Zabbix administrators
 Send to Users : admin
Send only to : Email
Default message : V
체크

Conditions : N/A

Add
클릭하면 아래와 같이 적용 확인됨

사용자 삽입 이미지



3번째 sub tab menu “Recovery operations”은 “Operations”와 동일한 방법으로 기본값을 그대로 사용하는 설정을 한다. 4번째 menu “Acknowledgement operations”는 생략한다.

 

Recovery operations

파라미터

설정

Default subject

이벤트 수신 내용의 제목 형식을 설정한다.

Resolved: {TRIGGER.NAME}

Default message

이벤트 수신 내용의 상세 메시지 형식을 설정한다.

Problem has been resolved at {EVENT.RECOVERY.TIME} on {EVENT.RECOVERY.DATE}

Problem name: {TRIGGER.NAME}

Host: {HOST.NAME}

Severity: {TRIGGER.SEVERITY}

 

Original problem ID: {EVENT.ID}

{TRIGGER.URL}

Operation details

New 클릭

사용자 삽입 이미지





Operation type
: Notify all involved (
문제 event를 통지 받은 모든 사용자에게 recovery message를 송신) 선택
Default message : V
체크

Add
클릭


Operations, Recovery operations 설정을 마쳤으면 아래 Add 아이콘을 클릭하여 설정을 마무리한다.

사용자 삽입 이미지

이제 Trigger 이벤트 발생 시 Email로 alarm을 받게 될 것이다.

참고문서

2 Operations

https://www.zabbix.com/documentation/3.4/manual/config/notifications/action/operation

3 Recovery operations

https://www.zabbix.com/documentation/3.4/manual/config/notifications/action/recovery_operations

4 Acknowledgement operations

https://www.zabbix.com/documentation/3.4/manual/config/notifications/action/acknowledgement_operations



$2

Telegram alarm을 받기 위해서는 Telegram Bot과, Bot을 call하는 python 스크립트가 필요하다.

본 문서에서는 CentOS 7에 설치된 Zabbix Server에 구성하는 법을 다룬다.

Step 1) Zabbix Server에 python-pip 설치

[root@zabbix-server ~]# wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

[root@zabbix-server ~]# rpm -ivh epel-release-latest-7.noarch.rpm

[root@zabbix-server ~]# yum install python-pip

Step 2) Zabbix Server에 python-pip가 설치되었으면 request module for python, python-telegram-bot module for python 추가 설치

[root@zabbix-server ~]# pip install requests

[root@zabbix-server ~]# pip install python-telegram-bot --upgrade

Step 3) alertscript를 사용할 수 있도록 Zabbix Server 설정

[root@zabbix-server ~]# vim /etc/zabbix/zabbix_server.conf

AlertScriptsPath=/usr/lib/zabbix/alertscripts

[root@zabbix-server ~]# systemctl restart zabbix-server

※ pacemaker HA 구성한 Zabbix Server 환경에서는 Zabbix Server를 그냥 재시작하면 안 된다. HA를 maintenance mode로 변경한 뒤 재시작해야 한다.

pacemaker HA resources에 maintenance mode 적용 및 확인

[root@zabbix-server ~]# pcs property set maintenance-mode=true

[root@zabbix-server ~]# pcs status

pacemaker HA resources의 maintenance mode 해제

[root@zabbix-server ~]# pcs property unset maintenance-mode

[root@zabbix-server ~]# pcs status

Step 4) Telegram bot 만들어 HTTP API token 얻기

Telegram bot을 만들기 위해서는 자신의 Telegram 계정이 하나 필요하다. 자신의 전화번호로 계정을 하나 만든다.

다음으로 Bot을 만들기 위해 Telegram client 에서 대화상대로 BotFather를 찾는다.

사용자 삽입 이미지

BotFather와의 대화창으로 들어간다.
사용자 삽입 이미지

BotFather에게 대화를 걸어본다. "/start"라고 입력해 보자. bot 생성을 위해서는 "/newbot"을 입력하면 되는 것으로 응답내용에서 확인할 수 있다.
사용자 삽입 이미지
"/newbot"을 입력하면 bot 이름 입력을 요구 받는다. “<name>_bot” 형식으로 입력한다.
사용자 삽입 이미지
이름을 올바르게 입력하면 bot이 새로 생성되며 HTTP API token을 발급받는다. 이 token을 메모해 둔다. 다시 ‘/start’를 입력하여 bot 동작을 개시한다.
사용자 삽입 이미지

bot 테스트를 해보자. 아래 URL 형식을 지켜 웹브라우저 주소창에 입력하자. 빨간색 부분을 자신의 HTTP API token 값으로 바꾸어 입력한다.

https://api.telegram.org/bot52946xxxx:EETRNJU3jQEGWQdjNv3llb4bnDSDREGuuuL/getUpdates

“ok” 내용을 포함하는 JSON 포맷의 응답 내용이 확인되면 bot을 이제 컨트롤할 수 있다.

나의 계정을 이용하여 telegram bot을 움직여 bot이 메시지를 보내는 테스트를 해 보자. 테스트 결과는 bot으로부터 메시지를 수신하는 것이다. 테스트를 위해서는 bot을 만드는 데 쓰인 내 telegram 계정의 chat_id를 알아야 한다(bot의 chat_id가 아님에 유의한다). telegram서버와 통신 가능하며, python 실행이 가능한 아무 시스템에서 아래 python code를 작성한다. 빨간색 부분을 자신의 token으로 입력한다.

[root@zabbix-server ~]# vi find_chat_id.py

#!/usr/bin/env python

import telegram
import requests

my_token = '52946xxxx:AAH1KMyc3rVYVeg3aS5miS60jg03GVTAViQ'

bot = telegram.Bot(token = my_token)

updates = bot.getUpdates()

for u in updates :

print(u.message)



chat_id를 확인하였다(여기서는 38510xxx).

[root@zabbix-server ~]# python find_chat_id.py

{'delete_chat_photo': False, 'new_chat_photo': [], 'from': {'username': u'amogae-son', 'first_name': u'Gil-Dong', 'last_name': u'Hong', 'is_bot': False, 'language_code': u'ko-KR', 'id': 38510xxx}, 'text': u'/my_id', 'caption_entities': [], 'entities': [{'length': 6, 'type': u'bot_command', 'offset': 0}], 'channel_chat_created': False, 'new_chat_members': [], 'supergroup_chat_created': False, 'chat': {'username': u' amogae-son ', 'first_name': u' Gil-Dong ', 'last_name': u'Hong', 'type': u'private', 'id': 38510xxx}, 'photo': [], 'date': 1518865536, 'group_chat_created': False, 'message_id': 1523, 'new_chat_member': None}

[root@zabbix-server ~]#

확인한 chat_id를 추가 입력하는 아래 URL에 액세스해 본다. bot으로부터 “Hello” 응답이 올 것이다.

https://api.telegram.org/bot52946xxxx:EETRNJU3jQEGWQdjNv3llb4bnDSDREGuuuL/sendMessage?chat_id=38510xxx&text=Hello

사용자 삽입 이미지

Step 5) 이제 Telegram bot을 call하는 python 스크립트를 Zabbix Server에 작성할 차례이다.

아래 URL에서 python 스크립트 소스를 받는다.

Zabbix-in-Telegram

https://github.com/ableev/Zabbix-in-Telegram

압축 풀어 나오는 Zabbix-in-Telegram-master 디렉토리를 /usr/lib/zabbix/alertscripts 에 위치시킨다. 각 파일들의 ownership과 permission을 아래 출력과 동일하게 설정한다.

[root@zabbix-server alertscripts]# pwd

/usr/lib/zabbix/alertscripts

[root@zabbix-server alertscripts]# ls -lh

total 4.0K

drwxr-xr-x 3 zabbix zabbix 4.0K Feb 17 20:11 Zabbix-in-Telegram-master

[root@zabbix-server alertscripts]# ls -lh Zabbix-in-Telegram-master/

total 76K

drwxr-xr-x 2 zabbix zabbix   47 Feb 10 18:39 bash-old-version

-rw-r--r-- 1 zabbix zabbix 1.1K Feb 10 18:39 LICENSE.txt

-rw-r--r-- 1 zabbix zabbix 4.3K Feb 10 18:39 README.md

-rw-r--r-- 1 zabbix zabbix   41 Feb 10 18:39 requirements.txt

-rwxr--r-- 1 zabbix zabbix 6.9K Feb 10 18:39 ZbxTgDaemon.py

-rwxr--r-- 1 zabbix zabbix    8 Feb 10 18:39 zbxtg_group.py

-rwxr--r-- 1 zabbix zabbix  36K Feb 11 18:51 zbxtg.py

-rw-r--r-- 1 zabbix zabbix 1.3K Feb 10 18:39 zbxtg_settings.example.py

-rw-r--r-- 1 zabbix zabbix 1.3K Feb 12 21:36 zbxtg_settings.py

-rw-r--r-- 1 root   root   1.1K Feb 12 21:43 zbxtg_settings.pyc

[root@zabbix-server alertscripts]#

zbxtg_settings.py 을 아래와 같이 작성한다. 빨간색 부분이 수정을 필요로 한다.

[root@zabbix-server Zabbix-in-Telegram-master]# vi zbxtg_settings.py

# -*- coding: utf-8 -*-

tg_key = "52946xxxx:AAH1KMyc3rVYVeg3aS5miS60jg03GVTAViQ"  # telegram bot api key

zbx_tg_prefix = "zbxtg"  # variable for separating text from script info

zbx_tg_tmp_dir = "/var/tmp/" + zbx_tg_prefix  # directory for saving caches, uids, cookies, etc.

zbx_tg_signature = False

zbx_tg_update_messages = True

zbx_tg_matches = {

    "problem": "PROBLEM: ",

    "ok": "OK: "

}

zbx_server = "http://127.0.0.1/zabbix/"  # zabbix server full url

zbx_api_user = "admin"

zbx_api_pass = "xxxxx"

zbx_api_verify = False  # True - do not ignore self signed certificates, False - ignore

zbx_basic_auth = False

#zbx_basic_auth_user = "zabbix"

#zbx_basic_auth_pass = "xxxxx"

proxy_to_zbx = None

proxy_to_tg = None

#proxy_to_zbx = "proxy.local:3128"

#proxy_to_tg = "proxy.local:3128"

google_maps_api_key = None  # get your key, see https://developers.google.com/maps/documentation/geocoding/intro

zbx_tg_daemon_enabled = False

#zbx_tg_daemon_wl_ids = ["trim703", ]

#zbx_tg_daemon_wl_u = ["xxx", ]

zbx_db_host = "localhost"

zbx_db_database = "zabbix"

zbx_db_user = "zabbix"

zbx_db_password = "xxxxx"

 

파라미터

설정

tg_key

Telegram HTTP API token 입력

zbx_server

Zabbix-in-Telegram플러그인을 Zabbix Server에 설치한 관계로
기본값
http://127.0.0.1/zabbix/ 그대로 사용

zbx_api_user

Zabbix dash board 로그인 username
(admin
계정이 아니어도 된다)

zbx_api_pass

Zabbix dash board 로그인 계정의 password

zbx_api_verify

zbx_server url프로토콜이 https일 경우 SSL errors를 무시하도록 함. False로 설정

zbx_basic_auth

False

zbx_tg_daemon_enabled

False

zbx_db_host

DB서버의 hostname이나 ip address

zbx_db_database

DB서버의 Zabbix DB db name

zbx_db_user

DB서버의 Zabbix DB user name

zbx_db_password

DB서버의 Zabbix DB user password

작성했으면 CLI에서 테스트

형식)

# su - zabbix -c “/usr/lib/zabbix/alertscripts/Zabbix-in-Telegram-master/zbxtg.py “<username of telegram>” ”subject” “description” ”

※ <username of telegram>은 bot을 만드는데 사용되었던 username이다. 띄어쓰기가 없다면 각 아규먼트를 따옴표로 감싸지 않아도 된다.

예)

[root@zabbix-server Zabbix-in-Telegram-master]# su - zabbix -c "/usr/lib/zabbix/alertscripts/Zabbix-in-Telegram-master/zbxtg.py "username" "TEST" "OK""

아래와 같이 Telegram client에서 수신되는 것을 확인할 수 있다.

사용자 삽입 이미지

이제 Zabbix Server 대시보드에서 이 스크립트를 사용하는 설정만 하면 된다.

Step 6) Zabbix Server 대시보드에서 Telegram 미디어 생성

Administration -> Media types -> Create media type

사용자 삽입 이미지

파라미터

설정

Name

원하는 Media Name을 선택 (: Telegram)

Type

Script

Script name

Zabbix Server zabbix_server.confAlertScriptsPath 파라미터에 정의된 Path 이하의 스크립트 소스 위치를 작성한다.

Zabbix-in-Telegram-master/zbxtg.py
라고 작성

Script parameters

아래 3가지 파라미터 작성

{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}

CLI에서 zbxtg.py 스크립트 실행 테스트 시 함께 입력했던 3가지 아규먼트에 해당

Enabled

V 체크

Step 7) 만든 Media를 User에게 할당
Adminisration -> Users -> Alias 필드에서 원하는 User -> Media 탭-> Add

파라미터

설정

Type

앞의 Media Type에서 만들었던 MediaName들이 펼침메뉴로 제공된다.
(
: Telegram)

Send to

bot을 만드는데 사용되었던 username
(
: @username)

When active

기본값 그대로 사용

Use if severity

Alarm을 받기 원하는 severity를 선택

(: 모두 선택)

Enabled

V 체크

Step 8) Actions 설정

Email alarm 설정 방법과 대동소이하다.

Configuration -> Actions -> 기본값으로 “Report problems to Zabbix administrators” Action이 Disabled 상태로 생성되어 있다. 이를 그대로 사용해도 되나 본 문서에서는 신규 Action을 생성하는 방법을 설명한다. ->우측 상단 “Event source” 드롭다운 메뉴에서 “Triggers” 선택하고 Create action 클릭

사용자 삽입 이미지

여기까지 진행하였으면 4가지 sub tab menu가 확인될 것이다.
사용자 삽입 이미지

먼저 Action을 설정한다. 이 메뉴에서는 뒤에 설명할 Operations, Recovery operations의 조건을 설정한다.
Action

파라미터

설정

Name

원하는 Action 이름을 입력
(
: Report problems to Zabbix administrators by Telegram)

Conditions

아래 New condition을 통해 만든 conditon이 나열된다. 삭제를 원하면 우측 Remove 클릭

<strong참고문서>$2
https://www.zabbix.com/documentation/3.4/manual/config/notifications/action/conditions

New condition

본 문서에서는 어떤 장비이든지 특정 Trigger 이벤트 발생하면 모두 원하는 Action이 일어나도록(여기서는 alarm) 하는 설정을 할 것이다. 왼쪽 드롭다운 메뉴에서 Trigger
를 선택, 중간 드롭다운 메뉴의 연산자로는 =를 선택, 우측 Select
를 클릭하여 나오는 팝업 창의 우측 상단 드롭다운 메뉴에서 Templates/Operating System, Template OS Linux를 선택하여 나오는 모든 Trigger를 선택한다.

사용자 삽입 이미지

Add 클릭하여 Conditions 에 포함시킨다.

Enabled

V 체크



Add를 한 뒤의 설정 모습
사용자 삽입 이미지

다음 Sub tab 메뉴 “Operations”을 설정한다. Operations에는 sub tab menu ”Action”에서 정의한 조건 발생 시 어떤 동작을 할 지 설정한다. 모든 입력창의 내용에 대해 Email alarm 설정에서는 기본값 그대로 사용하는 방법을 설명했으나, Telegram 용 alarm 설정에서는 python 스크립트에 의해 사용 가능해진 매크로를 사용하여 그래프 출력까지 가능한 설정을 설명한다.

Operations

파라미터

설정

Default operation step duration

1h

Default subject

이벤트 수신 내용의 제목 형식을 설정한다.

Problem: {TRIGGER.NAME}

Default message

이벤트 수신 내용의 상세 메시지 형식을 설정한다.

Last value: {ITEM.LASTVALUE1} ({TIME} on {DATE})

Severity: {TRIGGER.SEVERITY}

zbxtg;graphs

zbxtg;graphs_period=10800

zbxtg;itemid:{ITEM.ID1}

zbxtg;title:{HOST.HOST} - {TRIGGER.NAME}

Pause operations while in maintenance

V 체크

Operations detail

New 클릭

사용자 삽입 이미지

<strongSteps>$2 : 기본값 사용 (1-1)
$2 :
기본값 사용 (0)
$2 : Send message
선택
$2 :
본 챕터에서는 admin useralarm 설정을 설명하고 있으므로 아래 두 설정 중 택일한다.
 Send to User groups
 : Zabbix administrators
 Send to Users : admin
$2 : Telegram
$2 : V
체크

<strongConditions>$2 : N/A

Add
클릭하면 아래와 같이 적용 확인됨

사용자 삽입 이미지
 


3번째 sub tab menu “Recovery operations”은 “Operations”와 동일한 방법으로 설정한다. 4번째 menu “Acknowledgement operations”는 생략한다.
Recovery operations

파라미터

설정

Default subject

이벤트 수신 내용의 제목 형식을 설정한다.

Resolved: {TRIGGER.NAME}

Default message

이벤트 수신 내용의 상세 메시지 형식을 설정한다.

Last value: {ITEM.LASTVALUE1} ({TIME} on {DATE})

Severity: {TRIGGER.SEVERITY}

zbxtg;graphs

zbxtg;graphs_period=10800

zbxtg;itemid:{ITEM.ID1}

zbxtg;title:{HOST.HOST} - {TRIGGER.NAME}

Operation details

New 클릭

사용자 삽입 이미지

$2 : Notify all involved (문제 event를 통지 받은 모든 사용자에게 recovery message를 송신) 선택
$2 : V
체크

Add
클릭


Operations, Recovery operations 설정을 마쳤으면 아래 Add 아이콘을 클릭하여 설정을 마무리한다.
사용자 삽입 이미지
이제 Trigger 이벤트 발생 시 Telegram으로 alarm을 받게 될 것이다.
사용자 삽입 이미지
Creative Commons License