웹 훅을 이용하여 Zabbix & Slack 알람하기.

Zabbix의 경우 시스템 모니터링을 하면서 문제가 생겼을때 여러가지 방법으로 알람을 할 수 있는 방법을 지원한다. 여기서는 Webhook을 통해서 Slack 메신저와 연동해서 문제 발생시 Slack 으로 알람을 받을 수 있도록 시스템을 구축하도록 하겠다.

Webhook이란

간단하게 말해서 역방향 API 라고 보면된다. 일반적인 API의 경우 클라이언트가 서버에게 요청을 하는 반면에 웹훅은 서버에서 특정 조건을 만족하는 트리거가 실행됐을때 클라이언트에게 요청하는 거라고 보면 된다.

Zabbix를 예를 들어 설명하면 만약 Zabbix agent에 icmp를 통해 헬스체크를 하고있다면 실패했을때 Problom이 뜬다.
이걸 트리거로 만들어서 Problom이 발생하면 Slack Webhook을 통해서 메시지 알람을 띄우는거다.

준비물

Slack Webhook 주소, Zabbix 서버, slack.sh 스크립트

Slack Webhook 주소 확인하기.

먼저 Slack 계정은 있다는 가정하에 진행하겠다. 슬랙에 로그인 한뒤 아래 주소로 들어가서 채널 선택을하면 Webhook 주소 발급 가능하다

https://my.slack.com/services/new/incoming-webhook

포스트를 올릴 채널 설정.

여기서 웹 훅 URL을 따로 저장해두자.

slack.sh 스크립트 서버에 넣기.

스크립트 출처 : https://github.com/ericoc/zabbix-slack-alertscript/blob/master/slack.sh

#!/bin/bash

# Slack incoming web-hook URL and user name
url='CHANGEME'      # example: url='https://hooks.slack.com/services/QW3R7Y/D34DC0D3/BCADFGabcDEF123'
username='Zabbix'

## Values received by this script:
# To = $1 / Slack channel or user to send the message to, specified in the Zabbix web interface; "@username" or "#channel"
# Subject = $2 / subject of the message sent by Zabbix; by default, it is usually something like "(Problem|Resolved): Lack of free swap space on Zabbix server"
# Message = $3 / message body sent by Zabbix; by default, it is usually approximately 4 lines detailing the specific trigger involved
# Alternate URL = $4 (optional) / alternative Slack.com web-hook URL to replace the above hard-coded one; useful when multiple groups have seperate Slack teams
# Proxy = $5 (optional) / proxy host including port (such as "example.com:8080")

# Get the user/channel ($1), subject ($2), and message ($3)
to="$1"
subject="$2"
message="$3"

# Change message emoji and notification color depending on the subject indicating whether it is a trigger going in to problem state or recovering
recoversub='^RECOVER(Y|ED)?$|^OK$|^Resolved.*'
problemsub='^PROBLEM.*|^Problem.*'

if [[ "$subject" =~ $recoversub ]]; then
    emoji=':smile:'
    color='#0C7BDC'
elif [[ "$subject" =~ $problemsub ]]; then
    emoji=':frowning:'
    color='#FFC20A'
else
    emoji=':question:'
    color='#CCCCCC'
fi

# Replace the above hard-coded Slack.com web-hook URL entirely, if one was passed via the optional 4th parameter
url=${4-$url}

# Use optional 5th parameter as proxy server for curl
proxy=${5-""}
if [[ "$proxy" != '' ]]; then
    proxy="-x $proxy"
fi

# Build JSON payload which will be HTTP POST'ed to the Slack.com web-hook URL
payload="payload={\"channel\": \"${to//\"/\\\"}\",  \
\"username\": \"${username//\"/\\\"}\", \
\"attachments\": [{\"fallback\": \"${subject//\"/\\\"}\", \"title\": \"${subject//\"/\\\"}\", \"text\": \"${message//\"/\\\"}\", \"color\": \"${color}\"}], \
\"icon_emoji\": \"${emoji}\"}"

# Execute the HTTP POST request of the payload to Slack via curl, storing stdout (the response body)
return=$(curl $proxy -sm 5 --data-urlencode "${payload}" $url -A 'zabbix-slack-alertscript / https://github.com/ericoc/zabbix-slack-alertscript')

# If the response body was not what was expected from Slack ("ok"), something went wrong so print the Slack error to stderr and exit with non-zero
if [[ "$return" != 'ok' ]]; then
    >&2 echo "$return"
    exit 1
fi

맨위에 url & name 은 자신의 Webhook 주소와 설정한 이름에 맞게 넣어주면 된다.

find / -name alertscripts 명령어로 alertscripts 주소 찾기.
/usr/lib/zabbix/alertscripts

vi /usr/lib/zabbix/alertscripts/slack.sh
chown zabbix:zabbix /usr/lib/zabbix/alertscripts/slack.sh
chmod 755 /usr/lib/zabbix/alertscripts/slack.sh

스크립트 작성하고 권한 부여.

TEST

Zabbix 웹 설정하기

Zabbix 웹 접근 -> 관리 -> 미디어 타입 -> 미디어 유형 생성

아래와 같이 작성

작성후에는 테스트 버튼으로 테스트

성공하면 아래처럼 뜬다.

이제 문제가 생겼을때 알람이 오도록 설정해보자.

관리 > 사용자 > 알람울릴 계정 선택 > 연락방법 > 슬랙을 매체유형

이건 계정을 새로 만들어서 해도되고.. 편한대로..하면 완료!

 

————————————————–

사이트 리뉴얼중입니다~

서버(Linux, ESXi), NAS(헤놀로지, ESXi 및 IT관련 정보, 기타 등등을 공유하는 커뮤니티 SVRFORUM을 새로 만들었습니다.
많은 가입(?) 부탁드립니다~
https://svrforum.com

이전글들은 모두 상단 메뉴의 Blog 글 모음에있습니다!

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

홈서버 IT 커뮤니티 SVRFORUM
Link