Home » Zabbix » Отправка уведомлений и графиков из zabbix в telegram

Отправка уведомлений и графиков из zabbix в telegram

Я чаще всего использую стандартные уведомления от zabbix на почтовый ящик, это позволяет спокойно спать. Тем не менее, решил пойти в ногу со временем и попробовать настроить отправку оповещений из zabbix в популярный мессенджер telegram. К тому же я постоянно активно пользуюсь этим мессенджером и считаю его очень удобным.

Введение

Способов настройки уведомлений из заббикса в телеграм существует несколько. Их можно разделить по информативности:

  • Отправка только текстовых оповещений
  • Отправка графиков

Так же можно разделить по типу реализации:

  • Использовать готового бота
  • Создать своего бота для уведомлений
  • Отправлять оповещения себе лично или в группу

Я постараюсь разобрать все возможные варианты. Идти будем от простого к сложному. Сначала настроим текстовые оповещения, потом добавим графики. Отправлять будем как в личку, так и в группу.

Кстати, еще один способ отправки уведомлений из zabbix — с помощью звонка через asterisk. Если вам это интересно, читайте соответствующий материал — оповещения zabbix через asterisk.

Я буду настраивать все в zabbix 3.4, установленный на Centos 7. Принципиального значения это не имеет, решение будет одинаково работать практически на всех дистрибутивах linux.

Если у вас еще нет своего сервера для мониторинга, то рекомендую материалы на эту тему. Для тех, кто предпочитает систему CentOS:

  1. Установка CentOS 7.
  2. Настройка CentOS 7.
  3. Установка и настройка zabbix сервера.

То же самое на Debian 9, если предпочитаете его:

  1. Установка Debian 9.
  2. Базовая настройка Debian 9.
  3. Установка и настройка zabbix на debian.

Приступим к реализации.

Создание бота в telegram

Первым делом создадим бота, через которого будем слать оповещения из заббикса. Для этого добавляем себе в контакты @BotFather и пишем ему сначала /start, потом /newbot.

Создание бота в telegram

Мы создали бота для оповещений и получили для него token, который нам понадобится далее. Теперь нужно добавить в свой список контактов созданного бота. Для этого найдите его по имени. В моем случае имя @serveradmin_zabbix_bot.

Теперь проверим, как работает отправка уведомлений через нашего бота. Для этого в консоли сервера набираем примерно такую команду:

# curl --header 'Content-Type: application/json' --request 'POST' --data '{"chat_id":"210806260","text":"Проверяю отправку оповещений ботом"}' "https://api.telegram.org/bot526250249:AAFtAqy4ln0BqK5vtU_9IoSlLduhtl8IaGg/sendMessage"

Бот пришлет оповещение.

Проверка оповещений

В моем запросе изменяемые данные следующие:

210806260 id моего аккаунта. Чтобы его узнать, добавьте бота @my_id_bot и напишите ему /start
Проверяю работу бота Текст сообщения
bot526250249:AAFtAqy4ln0BqK5vtU_9IoSlLduhtl8IaGg Слово bot и дальше token бота. Пишется все в одно слово.

Если все в порядке, двигаемся дальше. Это самая простая часть, тут не должно быть затруднений.

Скрипт для отправки оповещений

Напишем очень простой скрипт, который будет использовать zabbix для отправки оповещений в telegram. Стандартная настройка для директории со скриптами, которые использует заббикс для отправки уведомлений — /usr/lib/zabbix/alertscripts. Поменять ее можно в параметре AlertScriptsPath. Создадим скрипт.

# mcedit /usr/lib/zabbix/alertscripts/telegram.sh
#!/bin/bash

token='526250249:AAFtAqy4ln0BqK5vtU_9IoSlLduhtl8IaGg'
chat="$1"
subj="$2"
message="$3"

/usr/bin/curl -s --header 'Content-Type: application/json' --request 'POST' --data "{\"chat_id\":\"${chat}\",\"text\":\"${subj}\n${message}\"}" "https://api.telegram.org/bot${token}/sendMessage"

Сохраняем файл и делаем исполняемым.

# chmod +x /usr/lib/zabbix/alertscripts/telegram.sh

Проверим отправку сообщений с помощью нашего скрипта. Для этого запустим его и передадим 3 параметра:

# /usr/lib/zabbix/alertscripts/telegram.sh 210806260 Тест 'Проверяю отправку оповещений ботом'

Вы должны получить сообщения в телеграме. Если этого не происходит, разберитесь с ошибками, прежде чем двигаться дальше.

Настройка zabbix на отправку уведомлений в телеграм

Идем в web интерфейс zabbix и добавляем новый способ оповещений. Для этого переходим в раздел Администрирование -> Способы оповещений и создаем новый.

Добавление нового способа оповещения

Заполняем необходимые поля.

Параметры нового оповещения

В данном случае {ALERT.SENDTO}, {ALERT.SUBJECT} и {ALERT.MESSAGE} этот как раз наши параметры, которые мы будем передавать скрипту.

Добавим новый способ оповещения пользователю, для которого они будут добавляться. В моем примере только один пользователь администратор, ему я и добавлю. Для этого идем в раздел Администрирование -> Пользователи. Выбираем нужного пользователя и добавляем ему новый тип оповещений — Telegram.

Редактирование оповещений пользователя

В поле «Отправлять на» вводим свой Telegram ID. Все, этого достаточно, если у вас используются дефолтные настройки действий разделе Настройка -> Действия. По-умолчанию, там есть действие, которое отправляет администраторам при срабатывании любого триггера оповещение по всем указанным каналам связи.

Активация действия

Я обычно для проверки использую тестовый триггер, который срабатывает, если на сервер подключится по ssh 2 и более юзеров. Сделаю это на своем сервере и посмотрю результат. Когда триггер сработает, на дашборде будет информация.

Проверка срабатывания триггера

В телеграме бот пришлет уведомление.

Тестовое уведомление в телеграм

Когда условие срабатывания триггера будет прекращено, я получаю еще одно оповещение о том, что теперь все в порядке.

Закрытие триггера

Скорее всего, вам не понадобится получать уведомления в телеграм на все события, которые происходят в системе. Вам нужно вручную настроить действия, на которые вы хотите получать уведомления. Для этого надо отредактировать дефолтное правило и оставить там только email оповещения. А для телеграма сделать отдельные действия.

Я покажу как это сделать на отдельном примере. Я оставил в дефолтном правиле уведомления только по email. В телеграм я буду получать сообщения только о срабатывании одного триггера. В данном случае это будет упоминаемый раньше тестовый триггер, срабатывающий на кол-во подключенных ssh пользователей. Вы можете выбрать абсолютно любой триггер из имеющихся в наличии.

Идем в Настройка -> Действия и создаем новое действие. На первой вкладке «Действие» указываем имя и условие срабатывания.

Создание нового действия

На вкладке «Операции» добавляем нужное действие. Я выбрал отправку сообщения всей группе администраторов zabbix.

Параметры действия

Это же действие продублировал для операций восстановления и подтверждения. Сохраняем действие и проверяем. Вы должны получить следующие оповещения:

Пример уведомления в телеграме

Отправка оповещений в группу

Рассмотрим ситуацию, когда мы хотим отправлять уведомления из zabbix не конкретным людям, а сразу в группу, где будут несколько пользователей. Никаких особых настроек для этого не надо. Просто создайте группу в Телеграме, добавьте в эту группу бота @my_id_bot и напишите /start. Так вы узнаете ID группы. В эту же группу добавьте своего бота.

Теперь ID группы надо использовать в способе оповещения пользователя. Там, где мы раньше использовали ID пользователя, теперь ставим ID группы. Можете либо отредактировать предыдущий способ, либо добавить новый. Я добавлю новый, конкретно проделав следующие действия:

  1. Создал 2 способа оповещения: Telegram private и Telegram group. Способ оповещения в группу telegram
  2. Добавил оба этих способа пользователю администратор, указав соответствующие ID. Параметры telegram id
  3. Добавил оба эти способа в Действия. Действие для отправки уведомления в группу
Хочу обратить внимание, что ID группы начинается с тире, например -288179672. Я этот момент упустил и долго не мог сообразить, почему в группу не отправляются оповещения. Не знал, что этот символ является неотъемлемой частью.

После этого оповещения стали приходит как в приват, так и в общую группу. Можно настраивать разные сообщения на разные события и отправлять их по разным каналам. Это все настраивается под конкретные обстоятельства.

Отправка графиков из zabbix в telegram

Выше я рассказал, как вручную самостоятельно настроить отправку простых текстовых оповещений. В интернете мне попался скрипт на питоне, который умеет все это делать, плюс прикреплять к сообщениям графики. Сейчас я вам расскажу, как это все настроить. Если вам графики не нужны, то настраивать только оповещения все же проще так, как я сделал выше. Получается и понятнее, и быстрее, и питон не надо ставить на сервер, хотя обычно он там и так есть. По крайней мере в centos 7.

Речь идет вот об этом скрипте — https://github.com/ableev/Zabbix-in-Telegram. Скопируем себе исходники.

# cd /usr/src && git clone https://github.com/ableev/Zabbix-in-Telegram

Для его работы, как я уже сказал выше, у вас должен быть установлен в системе python версии 2.6.0. Именно такая версия указана у разработчика скрипта. У меня нормально работает на 2.7.5. Так же для работы необходим pip модуль requests. Если у вас его нет, то надо сначала установить pip:

# cd /usr/src && wget https://bootstrap.pypa.io/get-pip.py
# python get-pip.py

а потом и сам модуль:

# pip install requests

Копируем в директорию /usr/lib/zabbix/alertscripts файлы zbxtg.py и zbxtg_settings.example.py из скачанного с github проекта. Последний переименовываем в zbxtg_settings.py. Приводим содержимое zbxtg_settings.py примерно к такому виду.

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

tg_key = "526250249:AAFtAqy4ln0BqK5vtU_9IoSlLduhtl8IaGg"  # 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://zabbix.server.ru/"  # zabbix server full url
zbx_api_user = "zerox"
zbx_api_pass = "password"
zbx_api_verify = False  # True - do not ignore self signed certificates, False - ignore

zbx_basic_auth = False
zbx_basic_auth_user = ""
zbx_basic_auth_pass = ""

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 = [210806260, ]
zbx_tg_daemon_wl_u = ["zeroxzed", ]

zbx_db_host = "localhost"
zbx_db_database = "zabbix"
zbx_db_user = "zabbix"
zbx_db_password = "password"


emoji_map = {
    "OK": "✅",
    "PROBLEM": "❗",
    "info": "ℹ️",
    "WARNING": "⚠️",
    "DISASTER": "❌",
    "bomb": "💣",
    "fire": "🔥",
    "hankey": "💩",
}

Жирным я выделил те параметры, что нужно поменять. Вам необходимо указать token от бота, который мы ранее создавали, полный url адреса сервера с zabbix, учетную запись к нему. Лучше всего сделать отдельную учетку с доступом только на чтение. Она нужна для получения графиков. Так же вам нужно будет указать telegram id и логин. Они нам не понадобятся, так как мы не будем использовать локальную слежбу телеграма, но если поля оставить пустыми, то скрипт ругается на ошибку в конфиге. Поэтому заполняем своими данными. И в конце нужно будет указать параметры доступа к базе данных заббикса.

Сохраняем конфиг и проверяем работу скрипта. Если вы только создали бота, то не забудьте ему написать личное сообщение, для настройки персональных сообщений, либо из группы, чтобы он мог слать оповещения в группу. Проверим из консоли работу скрипта.

# /usr/lib/zabbix/alertscripts/zbxtg.py "@zeroxzed" "тест" "тестовое сообщение" --debug

В личку телеграма должно прийти тестовое сообщение, а в консоли появиться примерно такой вывод.

Проверка работы скрипта zbxtg.py

То же самое проделаем с группой.

# /usr/lib/zabbix/alertscripts/zbxtg.py "serveradmin_zabbix_group" "тест" "тестовое сообщение" --debug --group

Если все в порядке, двигаемся дальше. Если будут ошибки, сразу разбирайтесь, в чем может быть проблема.

Идем в web интерфейс и добавляем 2 новых способа оповещения: один для приватных сообщений, второй для группы. Делаем все то же самое, что и раньше.

Добавление нового оповещения с помощью zbxtg.py

Я добавляю ключ —debug на время отладки, чтобы лог работы и картинки сохранялись в /var/tmp/. Это может быть полезно. Потом надо убрать. После этого добавляем новые способы оповещения пользователю. Все то же самое, что делали для первого способа.

Включение оповещения у пользователя

Название учетки и группы я указал в виде имени, а не ID. С именами тоже работает, плюс так удобнее.

Теперь создаем новое действие. которое будет использовать созданные только что способы оповещения. Вот мой пример такого действия с использованием графиков и иконок emoji в сообщениях.

Шаблон операции

Тема по умолчанию {{WARNING}} Проблема: Превышено число SSH пользователей
Сообщение по умолчанию Последнее значение: {ITEM.VALUE1} ({TIME})
zbxtg;graphs
zbxtg;graphs_period=1800
zbxtg;itemid:{ITEM.ID1}
zbxtg;title:{HOST.HOST} — {TRIGGER.NAME}
Важность триггера: {TRIGGER.SEVERITY}
Host: {HOSTNAME} ({HOST.IP})
Описание:
{TRIGGER.DESCRIPTION}
  • {{WARNING}} — макрос для выставления иконки с восклицательным знаком
  • zbxtg;graphs — указывает, что будем отправлять график
  • zbxtg;itemid:{ITEM.ID1} — параметр автоматически определяет itemid для графика на основании информации об итеме в триггере, можно указать нужный itemid вручную
  • zbxtg;title — задает имя для заголовка графика

Все остальное понятно по смыслу. Вот полный список параметров, которые поддерживает скрипт:

zbxtg;graphs включает отправку графиков
zbxtg;graphs_period=10800 период за который строится график
zbxtg;graphs_width=700 ширина графика
zbxtg;graphs_height=300 высота графика
zbxtg;itemid:{ITEM.ID1} выбор itemid для графика на основе триггера
zbxtg;title:{HOST.HOST} — {TRIGGER.NAME} заголовок графика
zbxtg;debug включает режим отладки, некоторая дополнительная информация сохраняется в tmp_dir
zbxtg;channel включает возможность отправки оповещения в telegram channel

Для операции восстановления я нарисовал примерно такой шаблон.

Шаблон операции восстановления

Тема по умолчанию {{OK}} Решено: Превышено число SSH пользователей
 Сообщение по умолчанию  Server: {HOSTNAME} ({HOST.IP})
Описание:
Проблема устранена!
Время устранения проблемы: {DATE} {TIME}

И для подтверждения.

Шаблон операции подтверждения

Тема по умолчанию {{OK}} Подтверждено: Превышено число SSH пользователей
 Сообщение по умолчанию {USER.FULLNAME} подтвердил проблему {ACK.DATE} {ACK.TIME} со следующим сообщением:
{ACK.MESSAGE}Текущее состояние проблемы {EVENT.STATUS}

Сохраняем действие, активируем и проверяем. При срабатывании тестового триггера я получаю следующие оповещения с графиком в telegram.

Пример отправки графика из zabbix в telegram

Получилось красиво и наглядно. Если нажать на картинку, то она откроется в большом размере.

График из заббикса

Обращаю внимание. Для того, чтобы отправлялся график в telegram, он должен существовать в системе мониторинга. Если его нет, то вы будете получать ошибку, вместо графика. Но текстовое оповещение будет приходить нормально.

Если у вас возникают ошибки с отправкой графиков, то проверить их работу можно в консоли. Вот пример запроса.

# # sudo -u zabbix ./zbxtg.py zeroxzed test "$(echo -e 'zbxtg;graphs: \nzbxtg;graphs_period=3600\nzbxtg;itemid:23301\nzbxtg;title:ololo')"
zbxtg.py: Bad Request: PHOTO_INVALID_DIMENSIONS
zbxtg.py: Zabbix user couldn't get graph (probably has no rights to get data from host), check script manually, see https://github.com/ableev/Zabbix-in-Telegram/wiki/Graphs

Это нормальный вывод ошибки, которая указывает на то, что выбран itemid 23301, которого либо не существует, либо к нему нет доступа, либо для него нет графика. Если выбрать правильный itemid, то после выполнения скрипта никакого вывода не будет, а в телеграм будет отправлен выбранный график.

Отправка только графика в телеграм из заббикса

Можете теперь настраивать по своему усмотрению графики, триггеры, события с отправкой оповещений и графиков в telegram.

Заключение

Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!

Теперь у нас zabbix работает современно, модно, молодежно 🙂 Использует telegram для отправки оповещений с графиками. Функционал удобный и настраивается достаточно просто. У меня практически не было затруднений, когда разбирал тему. Возьму себе на вооружение и буду по необходимости использовать. Хотя сам не люблю оповещения в телеграме, и чаще всего их отключаю, как и от остальных программ. Не нравится, когда меня в каждую минуту могут отвлечь какие-то события. Проверка почты раз в 30 минут самая подходящая интенсивность для меня.

Тем не менее, при работе коллектива, оповещения в общую группу могут быть очень удобны. Особенно, если только на мониторинге сидят отдельные люди, в чью задачу входит оперативная реакция на события.

Помогла статья? Есть возможность отблагодарить автора

25 комментариев

  1. Отличная статья!
    Огромное спасибо! Прикрутилось уведомление на телегу!
    Графики решил попозже сделать, но пока и этого более чем достаточно!

  2. спасибо!

  3. Дмитрий

    Как всегда хорошая статья, только вчера настроил по другому способу через Crier. Но Ваш гораздо интереснее.

    У меня Centos 6.5 phyton 2.7.5 zabbix 3.2.10 есть пару проблем:

    1. Скрипт отправки сообщений из консоли работает, но сам zabbix не отправляет хотя в отчете пишет, что уведомление отправлено.

    Все права на скрипт chown и chmod даны.

    2. при проверки на дебаг zbxtg.py вылезает ошибка

    File «/usr/lib/zabbix/alertscripts/zbxtg.py», line 717
    multiple_to = {i: [] for i in to_types}

    • Дмитрий

      Насчет второй проблемы вопрос решился, Centos новый python не увидел =)
      А вот с отправкой сообщений пока беда

      • Попробуй для теста запустить заббикс с правами рута. Там в конфиге есть такой параметр. И проверь.

        • Дмитрий

          Запустил через Allowroot=1 в zabbix_server.conf
          Не помогло.
          Все дело идет к тому, что настало время переселять zabbix на centos 7 и заодно новую версию ставить.

  4. Андрей

    Настроил оповещения без графиков, работает только на пользователя, на группу не хочет. Хотя тире ставлю.

    • Где-то ошибка значит. У меня все получилось и с группой, и с учеткой. Принципиальной разницы в настройках нет.

  5. Было бы круто, чтобы можно получить график по запросу
    Отправил команду боту, он тебе в ответ график 🙂

    Вообще из Zabbix скриптом каким-нибудь внешним есть возможность графики вытягивать — по itemid например?

  6. Николай

    Попробовал прикрутить скрипт к Zabbix 4.0pre вот такие результаты:
    При выполнении скрипта выходит ошибка: {«ok»:false, «error_code»:404, «description»:»Not Found»}

    Пробовал сделать так:
    /usr/bin/curl -s «https://api.telegram.org/bot${token}/sendMessage?chat_id=${chat}&text=${subj}\n${message}»

    При таком подходе скрипт отрабатывает, но при передаче параметров в скрипт из заббикса — сообщения не отправляются

    • Николай

      Да при этом сообщение приходит вот в таком виде: Test\nTest script.
      т.е форматирование не применяется

  7. При попытке отправить в групповой чат, выходит такая ошибка
    zbxtg.py: You need start a conversation with your bot first in ‘namegroup’ group chat, type ‘/start@NameBot’
    в личку нормально шлет, не могу понять — с чем может быть связно?
    в чате /start@NameBot писал, бесполезно.

    • Все, разобрался. Надо писать название группы, а я идентификатор ее писал 🙂

  8. Здравствуйте автор!
    Спасибо большее за Ваши статьи, очень помогают как начинающему сис админу.
    Вынужден заметить, что натолкнулся на проблему:
    «zbxtg.py: User ‘*********’ needs to send some text bot in private» — после выполнения файла. Решение это правка скрипта в этом же файле «zbxtg.py». При выполнении данного скрипта возникает ошибка проверки имени, по-скольку некоторые пользователи не имеют «uid Telegram».

    По сему по всему нужно убрать строки с куска функции get_uid:
    if «username» in chat: if chat[«username»] == name: uid = chat[«id»] оставив только uid = chat[«id»]. Всех благ жду от Вас The Dude.

  9. Добрый день!Спасибо за статью,у меня скрипт работает,но вместо одного события шлет 3,все оповещения затраиваются.С чем это может быть связано? Добавлены 3 пользователя и всем трем шлет по 3 оповещения

    • Надо раздел «Действия» смотреть и вникать в то, что там настроено. Все оповещения там.

  10. Ростислав

    в чем может быть проблема? сделал все так как в статье по телеграмму отправляю старт и не приходит ид чата

  11. Ростислав

    https://www.shellhacks.com/ru/telegram-api-send-message-personal-notification-bot/

    Кому цікаво ось по телеграму стаття

  12. Алексей

    Добрый день.
    Нужна помощь по настройке данной радости на zabbix 3.4 в docker.

    Изначально скрипт не срабатывает, ссылаясь на строку 8 в telegram.sh, со словами

    /usr/lib/zabbix/alertscripts/telegram.sh: line 8: /usr/bin/curl: No such file or directory

    что логично, ибо в контейнере любые сервисы отсутсвуют и курла нет.

    2й же метод сообщает

    Traceback (most recent call last):
    File «/usr/lib/zabbix/alertscripts/zbxtg.py», line 9, in
    import requests
    ImportError: No module named requests

    до сюда еще руки не дошли.

    т.к дефолтная ветка забикса для докера построена на linux alpine, там нет даже apt. Так что ставить курл нечем и этот путь слишком трудозатратный. Сначала нужно просто заставить работать.
    Это все мысли в слух, вдруг кому симптомы помогут.

    Заменил имидж сервера на ветку ubuntu-3.4-latest, установил курл внутрь контейнера. Питон там уже есть.
    способ временный, не суть важно.

    docker exec ID bash -c «apt update && apt install -y curl»

    Теперь ошибка следующая:
    Process exited with code: 60.

    2й метод не работает все с тем же выводом. —debug я на нем включил, но в логах пусто.

    Дальше копаться сил небыло, так что рад любой помощи.

    а еще на сайте регистрация не работает=)

    • А в чем смысл запуска заббикса в докере? Не улавливаю. Это постоянные проблемы и неудобства.

  13. Приветствую, всё сделал из CLI работает.
    Журнал действий утверждает, что всё ок, но нет сообщений. Как это дело в заббиксе отладить?
    Спасибо за статью!

Добавить комментарий

Ваш e-mail не будет опубликован.