[Zabbix 5.0] 자빅스 텔레그램 연동 (zabbix telegram)
-
자빅스 텔레그램 연동 (zabbix telegram)
자빅스에서 텔레그램을 연동하는 방법 입니다. 기존에 자빅스가 설치 되어 있어야 하고 자빅스의 버전에는 크게 영향을 받지 않아 보이네요.
테스트 환경은 CentOS 7.7, Python 3.8.1 버전으로 진행 했습니다. (파이썬 2버전은 중간에 에러가 발생 합니다)
Zabbix 5.0 설치 : https://nirsa.tistory.com/252?category=868727
Zabbix 4.4 설치 : https://nirsa.tistory.com/152?category=868727
Centos 7.7 파이썬 3.8 설치 : https://nirsa.tistory.com/112?category=861479
- 1) 초기 셋팅
yum -y install epel-release
yum -y install python-pip git
pip3 install requests
pip3 install telegram
pip3 install python-telegram-bot
zabbix_server.conf 파일에서 AlertScriptsPath를 확인 합니다. 디폴트 상태로 사용 하셔도 되고, 별도의 경로를 설정하고 싶다면 원하는 경로로 수정 후 zabbix-server 서비스를 재시작 해주세요.
vi /etc/zabbix/zabbix_server.conf
- 2) 텔레그램 채팅 봇 생성
텔레그램에서 botfather를 검색하여 메세지 창을 열어주면 메세지 창에 Start 가 보이실 텐데 클릭 하시면 됩니다. 저는 이전에 연동했던 이력이 있어서 아래 이미지에 조금 차이가 있을 수 있습니다.
/newbot을 입력한 후 봇 이름과 사용자명으로 사용할 네임을 작성 해주시면 됩니다. 저는 둘 다 똑같이 했고 사용자명의 경우 마지막에 bot 단어가 들어가야 합니다.
* 아래 빨간 박스 부분에 코드가 있을텐데 코드 전체를 복사하여 메모장 등에 보관 해주세요
이제 생성했던 채팅 봇의 사용자명을 검색하면 나오게 되는데, 클릭하여 시작 버튼까지 눌러 주세요.
* 봇을 시작하는걸 생략하면 404 에러가 발생하니 꼭 진행 해주셔야 합니다.
이제 위에서 fatherbot에게 받았던 코드를 사용하여 웹 브라우저에서 아래와 같이 입력하여야 합니다. 아래 코드는 예시 입니다.
* fatherbot에게 받았던 코드를 입력하는 앞단에 "bot" 이라는 단어가 들어가야하니 주의 해주세요.
# https://api.telegram.org/bot[fatherbot에게 받았던 코드]/getUpdates
https://api.telegram.org/bot1143349:Al8CbFtPQcKXVM/getUpdates
봇을 재대로 시작하고, 정확히 코드를 입력했다면 아래와 같은 텍스트가 출력 됩니다.
- 3) 템플릿 설치 및 설정
자빅스 서버로 되돌아 와서 아래 코드와 같이 템플릿을 설치한 후 작업을 진행 해주세요.
cd ~
git clone https://github.com/ableev/Zabbix-in-Telegram
mv Zabbix-in-Telegram/* /usr/lib/zabbix/alertscripts
이제 아래와 같이 텔레그램 채팅 id를 확인할 파이썬 파일을 하나 만들어 주어야 합니다. 위에서 브라우저에 입력할때는 father봇에게 받았던 코드 앞에 "bot" 단어를 추가 했었지만, 여기서는 따로 추가해주지 않고 그대로 사용 하시면 됩니다.
cd ~
vim chat.py
#!/usr/bin/env python
import telegram
import requests
my_token = '[father봇에게 받았던 코드]'
bot = telegram.Bot(token = my_token)
updates = bot.getUpdates()
for u in updates :print(u.message)
파이썬 3.8을 실행시켜 chat.py 파일을 실행 시켜주세요.
python3 chat.py
만약, 아무것도 출력되지 않는다면 채팅봇에게 채팅 아무렇게나 한번 치고나서 다시 시도하면 됩니다. 출력된 값에서 필요한것은 id 값의 숫자 입니다.
* 개인 채팅은 양수, 그룹 채팅은 음수로 표현 됩니다.
chat id까지 확인 되었다면 사용할 파일을 만들어야 하는데, 샘플 파일을 복사 후 권한을 설정 해주세요.
cp /usr/lib/zabbix/alertscripts/zbxtg_settings.example.py /usr/lib/zabbix/alertscripts/zbxtg_settings.py
chown -R root.zabbix /usr/lib/zabbix/alertscripts
usermod -a -G zabbix zabbix
이후 복사된 파일 /usr/lib/zabbix/alertscripts/zbxtg_settings.py 파일을 열은 후 아래 부분들을 수정 해주세요.
vi /usr/lib/zabbix/alertscripts/zbxtg_settings.py
tg_key = "[father봇에게 받은 코드]" # telegram bot api key
zbx_server = "http://[자빅스 서버 IP]/zabbix/" # zabbix server full url
zbx_api_user = "zabbix"
zbx_api_pass = "zabbix"
zbx_basic_auth_user = "nirsa_test_bot" # 아까 생성했던 봇 이름
zbx_basic_auth_pass = "[사용할 패스워드]"
zbx_tg_daemon_enabled_ids = ["[아까 확인한 chat id]", ]
zbx_tg_daemon_enabled_users = ["nirsa_test_bot", ] # 아까 생성했던 봇 사용자명
zbx_db_host = "localhost"
zbx_db_database = "zabbix"
zbx_db_user = "zabbix"
zbx_db_password = "[자빅스 설치 시 생성한 자빅스 계정 패스워드]"
서버쪽 마지막 설정으로 /var/tmp/zbxtg/uids.txt 파일에 아래 내용을 넣어주어야 합니다. 간혹 디렉토리가 생성되지 않아 쓰기가 불가능할 수 있기 때문에 추가 한번 해주고 갑니다.
mkdir /var/tmp/zbxtg
chown -R zabbix.zabbix /var/tmp/zbxtg
vi /var/tmp/zbxtg/uids.txt
# [봇 이름];private;[chat id]
nirsa_test_bot;private;105849283
이게 한번씩 chat id가 날라갈수도 있어서 아래 설정까지 해주어야 한다고 하네요. 해당 내용을 참고했던 블로그는 여기를 누르면 이동 됩니다.
vi /home/zabbix/uids.txt
## /var/tmp/zbxtg/uids.txt와 동일하게 작성
# [봇 이름];private;[chat id]
nirsa_test_bot;private;105849283
이후 아래 내용을 추가하여 스크립트 파일을 생성 합니다.
vim /home/zabbix/uids.sh
yes | cp -arpf /home/zabbix/uids.txt /usr/tmp/zbxtg/uids.txt
마지막으로 크론탭 설정을 해주시면 서버쪽 설정은 끝입니다.
crontab -e
0 0 * * * sh /home/zabbix/uids.sh >> /home/zabbix/uids_cron.log 2>&1
- 4) 자빅스 웹페이지 설정
Administration → Media types → Create media type(우측 상단)
이후 아래 내용과 같이 모두 작성 후 Add를 눌러 추가 합니다. Name을 제외한 나머지 부분은 똑같이 해주세요.
이후 Action은 따로 사용자를 만들어서 사용해도 되고 Admin 계정을 사용해도 됩니다. 단, 별도로 사용자 계정을 사용할 땐 최소 Only-Read 권한이 있어야 합니다.
Configuration → Actions → Create action(우측 상단)
별도로 조건식이 필요 하다면 Conditions에 추가하면 됩니다. 저는 따로 필요 없기 때문에 Name만 작성하고 넘어 가겠습니다.
좌측상단의 Operations를 누른 후 빨간 박스의 Add를 클릭 합니다. 이 필드는 알람 발생 설정 입니다.
Send to Users에 Admin을 추가 해주세요. 별도로 유저를 생성했다면 그 계정 또는 바로 위의 호스트 그룹에서 선택해도 됩니다.
이후 Send only to는 아까 생성했던 Media types 이름으로 설정하고 Custom message를 체크하면 칸이 더 생겨납니다.
Subject는 알람 제목이라고 생각하셔도 됩니다. 본인의 입맛에 맞게 수정 해주세요.
{{{TRIGGER.SEVERITY}}} [TEST ZABBIX] 문제 발생
아래는 알람의 내용 입니다. 이것도 커스텀 따로 하셔도 되고, Last value 밑에 있는 zbxtg쪽은 그래프를 가져오기 위한 내용 입니다. Memory 또는 CPU 등 그래프가 지원되는 알람의 경우 그래프도 함께 알람을 줍니다.
호스트: {HOST.NAME} ({HOST.IP})
심각도: {TRIGGER.SEVERITY}
알람 명: {TRIGGER.NAME}
발생 시기: {EVENT.DATE} , {EVENT.TIME}
Event ID: {EVENT.ID}
설명: {TRIGGER.DESCRIPTION}
Last value: {ITEM.LASTVALUE1} ({TIME})
zbxtg;graphs
zbxtg;graphs_period=10800
zbxtg;graphs_width=900
zbxtg;graphs_height=300
zbxtg;itemid:{ITEM.ID1}
zbxtg;title:{HOST.HOST} - {TRIGGER.NAME}
다 설정 했다면 Update를 눌러 추가 해주세요.
이번엔 Recovery operations 필드의 Add를 클릭 합니다. 이 필드는 알람 정상화 설정 입니다.
위에서 Operations를 설정할때와 똑같이 설정을 진행 합니다.
Subject와 message를 아래와 같이 작성 해주세요. 알람 정상화이므로 subject는 아래처럼 정상화 관련된 내용이 들어가는것이 좋습니다.
{{OK}} [DEV ZABBIX] 문제 해결(복구)
호스트: {HOST.NAME} ({HOST.IP})
심각도: {TRIGGER.SEVERITY}
알람 명: {TRIGGER.NAME}
복구 시기 : {EVENT.RECOVERY.DATE}, {EVENT.RECOVERY.TIME}
Event ID: {EVENT.ID}
Last value: {ITEM.LASTVALUE1} ({TIME})
zbxtg;graphs
zbxtg;graphs_period=10800
zbxtg;graphs_width=900
zbxtg;graphs_height=300
zbxtg;itemid:{ITEM.ID1}
zbxtg;title:{HOST.HOST} - {TRIGGER.NAME}
이후 Administration → Users 를 클릭한 후 Admin 계정을 클릭 해주세요. (만약, 별도의 계정으로 진행한다면 그 계정을 클릭 해주셔야 합니다.)
그다음 상단쪽에 보시면 Media가 있을텐데 클릭해주신 후 Add를 눌러 주세요.
이후 Type은 생성해놨던 group test로 해주시고 Send to는 채팅 봇 이름으로 적어 줍니다. 그 아래 부분은 알람을 받을 시간대와 알람 중요도를 설정하는 것인데 일반적으로 시간대는 디폴트 설정, 중요도는 각 환경에 맞게 설정 해주시면 됩니다.
* 일반적으로 information과 Warning은 중요도가 낮고 알람이 굉장히 많이 올 수 있으므로 Average 등급으로 권고 합니다.
설저이 모두 되었다면 Add를 누른 후 Update를 눌러서 적용 시켜 주세요.
-
텔레그램 알람 확인
다시 자빅스 서버로 돌아와서 아래와 같이 테스트해볼 수 있습니다.
# python3 /usr/lib/zabbix/alertscripts/zbxtg.py "@[봇 이름]" "제목" "내용"
python3 /usr/lib/zabbix/alertscripts/zbxtg.py "@nirsa_test_bot" "test" "test"
직접 트리거를 발생시켜 테스트 해보는 방법도 있지만, 시간 관계상 여기까지만 테스트 해보았습니다.
호스트 등록을 하고 CPU 또는 Memory 등 트리거 값을 조정 하거나 부하 툴을 사용하여 트리거를 발동 시키면 그래프와 함께 텔레그렘에 알람이 발생하시는걸 확인할 수 있습니다.