Bài viết trước chúng ta đã thiết lập gửi cảnh báo qua email. Nếu bạn không thường xuyên kiểm tra được email thì bài viết này sẽ hướng dẫn các bạn thiết lập cảnh báo qua một kênh khác là telegram.

Cấu hình

SSH vào checkmk server để thực hiện các bước sau

Tạo file telegram.py

vi /omd/sites/monitoring/share/check_mk/notifications/telegram.py

Thêm vào file nội dung như sau

#!/usr/bin/env python
# Telegram V2

# Copyright Mathias Kettner  2013  mk@mathias-kettner.de
#           Stefan Gehn      2016  stefan+cmk@srcxbox.net

# check_mk is free software;  you can redistribute it and/or modify it
# under the  terms of the  GNU General Public License  as published by
# the Free Software Foundation in version 2.  check_mk is  distributed
# in the hope that it will be useful, but WITHOUT ANY WARRANTY;  with-
# out even the implied warranty of  MERCHANTABILITY  or  FITNESS FOR A
# PARTICULAR PURPOSE. See the  GNU General Public License for more de-
# ails.  You should have  received  a copy of the  GNU  General Public
# License along with GNU Make; see the file  COPYING.  If  not,  write
# to the Free Software Foundation, Inc., 51 Franklin St,  Fifth Floor,
# Boston, MA 02110-1301 USA.

# Telegram notification based on asciimail notification from
# check_mk 1.2.6p16.

import os
import re
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import urllib
import urllib2
### CHANGE THESE ###
telegram_bot_token = 'TOKEN-HERE'
####################

tmpl_host_text = """*Check_MK: $HOSTNAME$ - $EVENT_TXT$*
```
Host:     $HOSTNAME$
Alias:    $HOSTALIAS$
Address:  $HOSTADDRESS$
Event:    $EVENT_TXT$
Output:   $HOSTOUTPUT$

$LONGHOSTOUTPUT$```"""

tmpl_service_text = """*Check_MK: $HOSTNAME$/$SERVICEDESC$ $EVENT_TXT$*
```
Host:     $HOSTNAME$
Alias:    $HOSTALIAS$
Address:  $HOSTADDRESS$
Service:  $SERVICEDESC$
Event:    $EVENT_TXT$
Output:   $SERVICEOUTPUT$

$LONGSERVICEOUTPUT$```"""

def substitute_context(template, context):
    # First replace all known variables
    for varname, value in context.items():
        template = template.replace('$'+varname+'$', value)

    # Remove the rest of the variables and make them empty
    template = re.sub("\$[A-Z_][A-Z_0-9]*\$", "", template)
    return template

def construct_message_text(context):
    notification_type = context["NOTIFICATIONTYPE"]
    if notification_type in [ "PROBLEM", "RECOVERY" ]:
        txt_info = "$PREVIOUS@HARDSHORTSTATE$ -> $@SHORTSTATE$"
    elif notification_type.startswith("FLAP"):
        if "START" in notification_type:
            txt_info = "Started Flapping"
        else:
            txt_info = "Stopped Flapping ($@SHORTSTATE$)"
    elif notification_type.startswith("DOWNTIME"):
        what = notification_type[8:].title()
        txt_info = "Downtime " + what + " ($@SHORTSTATE$)"
    elif notification_type == "ACKNOWLEDGEMENT":
        txt_info = "Acknowledged ($@SHORTSTATE$)"
    elif notification_type == "CUSTOM":
        txt_info = "Custom Notification ($@SHORTSTATE$)"
    else:
        txt_info = notification_type # Should neven happen

    txt_info = substitute_context(txt_info.replace("@", context["WHAT"]), context)

    context["EVENT_TXT"] = txt_info

    if context['WHAT'] == 'HOST':
        tmpl_text = tmpl_host_text
    else:
        tmpl_text = tmpl_service_text

    return substitute_context(tmpl_text, context)

def fetch_notification_context():
    context = {}
    for (var, value) in os.environ.items():
        if var.startswith("NOTIFY_"):
            context[var[7:]] = value.decode("utf-8")
    return context

def send_telegram_message(token, chat_id, text):
    url = 'https://api.telegram.org/bot%s/sendMessage' % (token)
    data = urllib.urlencode({'chat_id':chat_id, 'text':text, 'parse_mode':'Markdown'})
    #print("sending telegram message, url '%s', chat id '%s', text '%s'" % (url, chat_id, text))
    try:
        urllib2.urlopen(url, data).read()
    except urllib2.URLError, e:
        sys.stdout.write('Cannot send Telegram message: HTTP-Error %s %s\n' % (e.code, e))

def main():
    context = fetch_notification_context()
    telegram_chatid = context.get('CONTACT_TELEGRAM_CHAT_ID')
    if not telegram_chatid: # e.g. empty field in user database
        sys.stdout.write("Cannot send Telegram message: Empty destination chat id")
        sys.exit(2)
    text = construct_message_text(context)
    send_telegram_message(telegram_bot_token, telegram_chatid, text)

main()

Tại dòng số 29 khai báo token của con bot của bạn. Ví dụ token của tôi như sau

telegram_bot_token = '936053035:AAGbl5y7463f0BCCx4RjzpB3_XXXXXXXXXX'

Cấp quyền thực thi cho file

chmod +x /omd/sites/monitoring/share/check_mk/notifications/telegram.py

Restart lại omd

omd restart

Truy cập vào site để thực hiện các bước tiếp theo

Tạo thêm thuộc tính chat id cho user

  • Chọn 1 để vào users
  • Chọn 2 để chỉnh sửa các thuộc tính của user

Thêm thuộc tính


Khai báo thôn tin cho thuộc tính mới

  • 1: tên của thuộc tính bắt buộc đặt là TELEGRAM_CHAT_ID
  • 2: tên hiển thị
  • 3: Sử dụng Identify để cho phép người dùng điền
  • 4: Cho phép user thường có thể chỉnh sửa thuộc tính này
  • 5: Cho phép sử dụng thuộc tính này trong cảnh báo

Lưu lại và cập nhật thay đổi

Tạo user

Khai báo thông tin cho user. Khai báo chat id của user. Chat id có thể là user của 1 user hoặc group của telegram

Lưu lại và cập nhật thay đổi

Cấu hình cảnh báo

Tạo một rule mới

Chọn method là Telegram V2

Chỉ định user nhận cảnh báo

Điều kiện cảnh báo khi host được mật hoặc tắt

Lưu lại và cập nhật thay đổi

Khi một host được bật hoặc tắt thì bạn sẽ nhận được cảnh báo như sau

Đến đây việc cấu hình cảnh báo qua telegram đã thành công. Bạn có thể tham khảo thêm các bài viết về checkmk tại đây.