Не вполне стандартные задачи, с которыми мне приходится сталкиваться по работе и способы их решения.
Страницы
среда, 11 сентября 2019 г.
Telegram бот для Zabbix (устаревшее)
Актуальная версия здесь.
В предыдущем посте я описал установку системы мониторинга Zabbix с использованием Docker контейнеров. Сегодня мы попробуем настроить оповещения с помощью Telegram мессенджера.
Создаем Telegram бота
8. Как добавить Zabbix Plugin в Grafana Server ? / Zabbix / Grafana / Graphics / Metrics
curl —header ‘Content-Type: application/json’ —request ‘POST’ —data ‘/sendMessage»
#!/bin/sh token=’bot_token’ chat=»$1″ subject=»$2″ message=»$3″ /usr/bin/curl -s —header ‘Content-Type: application/json’ —request ‘POST’ —data «»,»text»:»$n$»>» «https://api.telegram.org/bot$/sendMessage
chmod +x zsender.sh
./zsender.sh User_ID ‘Test message’ ‘it is test message’
![]() |
Скрипт работает |
Настройка Zabbix для работы с ботом
- Подключаемся к контейнеру с Zabbix-Server
docker exec -i -t zabbix-server sh /var/lib/zabbix #
apk update apk upgrade apk add curl
cd /usr/lib/zabbix/alertscripts echo $’#!/bin/shntoken=»nchat=»$1″nsubject=»$2″nmessage=»$3″n/usr/bin/curl -s —header ‘Content-Type: application/json’ —request ‘POST’ —data «\»,\»text\»:\»$\n$\»>» «https://api.telegram.org/bot$/sendMessage»‘ >/usr/lib/zabbix/alertscripts/zsender.sh chmod +x /usr/lib/zabbix/alertscripts/zsender.sh
cat /usr/lib/zabbix/alertscripts/zsender.sh
Как создать Telegram бота для уведомлений от системы мониторинга
![]() |
Жмем тест |
![]() |
Результат тестирования |
![]() |
Жмем добавить |
![]() |
Вводим User_ID/-Group_ID |
![]() |
Результат |
Оповещение через Telegram настроено!
Для тонкой настройки оповещений следует использовать пункт меню Настройка/действия(не является темой заметки). Интересующимся сюда .
Источник: a-katyrev.blogspot.com
Отправка алертов Zabbix в Telegram
Zabbix — самая вменяемая система мониторинга всего, что возможно. Чтобы быстро реагировать на алерты электронная почта не очень подходит, да и почта не всегда может дойти. А телега для этого самое то.
Для отправки алертов в телегу долго использовал свой малюсенький скриптик на баше. Потом через какое-то время появилась встроенная поддержка в самом заббиксе, но по сути делает то же самое.
В некоторых случаях при алертах приходилось залезать в графану и смотреть на графики, чтобы лучше понять проблему. Мысль добавить графики приходила в голову, но как-то думал, что не особо то и нужно. Но оказалось, что многим нужна. Допилил скрипт для отправки еще и графиков + добавил всяких плюшек. Оказалось с графиками стало жить легче Скрипт выложен на гитхабе.
Дока там есть, но опишу все здесь попонятнее. Настройка будет идти на Debian 11 и Zabbix 6.0.
Установка и настройка скрипта
Для начала нужно установить зависимости:
apt install curl jo jq
Переходим в директорию с кастомными скриптами заббикса:
cd /usr/lib/zabbix/alertscripts
Качаем сам скрипт:
wget https://raw.githubusercontent.com/zevilz/zabbix-alertscript-telegram/main/telegram.sh
Сразу меняем права у скрипта, т.к. там будут важные данные, и делаем его исполняемым:
chmod 700 telegram.sh chown zabbix:zabbix telegram.sh
По дефолту ошибки скрипта будут писаться в /usr/lib/zabbix/alertscripts/zbx_tlg_bot.log . Если лог нужно писать в другое место, то указываем этот путь в переменной SCRIPT_LOG_PATH . Файл лога создается автоматически, если его нет. Если юзер zabbix не сможет его создать, то получим ошибку при тесте отправки.
Не забываем перейти к чату с ботом и стартануть его. Если будете тестить в группе, то нужно добавить в нее бота и дать права на отправку сообщений.
Скрипт уже готов к отправке текстовых сообщений. Теперь нужно добавить новый способ оповещений в Zabbix. Для этого переходим Администрирование -> Способы оповещений и там вверху справа жмем на кнопку Создать способ оповещения .
В окрывшемся окне указываем следующее:
- Имя — Telegram
- Тип — Скрипт
- Имя скрипта — telegram.sh
В параметры скрипта добавляем:
Во вкладке Шаблоны сообщений добавляем нужные шаблоны. Сам текст шаблонов можно скопировать из существующих способов оповещений. Никакого дополнительного форматирования не нужно, просто текст. Дополнительно можно использовать Markdown и накидать смайликов Далее тыкаем по кнопке Добавить .
Шаблоны сообщений также можно задавать непосредственно в действиях триггеров. У них будет больший приоритет, и можно задавать разные шаблоны для разных случаев.
Теперь можно тестить отправку алертов. Для этого тыкаем по Тест в строке с новым способом оповещения:
В открывшемся окошке указываем свой ID или ID группы телеги (его можно узнать у бота zGetMyID_bot) и жмем на кнопку Тест . Если все ок, то получим такое уведомление:
А в телегу от бота придет это тестовое сообщение:
А если отправка провалится, то вы где-то накосячили. В уведомлении увидим ошибку, а если ее нет, то смотрим в лог скрипта.
Отправка графиков
Для отправки графиков нам нужен юзер, который будет иметь доступ к API и к графикам нужных хостов в веб-интерфейсе. Скрипт авторизуется в API, получает данные о графике, который привязан к элементу данных в триггере. Если график есть, то авторизуется уже в веб-интерфейсе и дергает сам график. Для этого можно заюзать существующего супер-админа, он имеет доступ ко всему.
Но теоретическим не очень безопасно, т.к. его данные для входа будут прописаны в скрипте, а они при определенных обстоятельствах могут утечь. Можно создать для этого обычного юзера с необходимыми правами, но нужно будет ему еще давать права на хосты и группы хостов, что неудобно. Проще всего создать юзера с новой супер-админской ролью, где будут минимальные права и доступ в API только к нужному методу ( graph.get ). Например, так:
С юзером определились. Теперь нужно определить необходимые переменные в скрипте:
- GRAPHS — включение отправки графиков, тут ставим 1 ;
- GRAPHS_DIR — полный путь к директории, куда временно будут сохранятся графики (по дефолту пусто, а графики будут сохраняться в директорию /tmp/zbx_graphs ; директория для графиков создается автоматически, если её нет; если юзер zabbix не сможет её создать, то получим ошибку при тесте отправки);
- ZABBIX_URL — полная ссылка к веб-интерфейсу заббикса (например: https://zabbix.site.com );
- ZABBIX_USER — юзер с доступами к графикам;
- ZABBIX_PASS — пароль юзера;
- ZABBIX_COOKIES_LIFETIME — время жизни куки авторизации в заббиксе (время жизни куки устанавливается на 14 дней, но они могут истечь раньше этого времени, а без авторизации не получится дергать графики; по дефолту стоит 30 секунд, т.е. переавторизация будет только при простое получения графиков более 30 сек; можно так и оставить);
- ZABBIX_COOKIES_PATH — полный путь к файлу куки (по дефолту пусто, а куки будут писаться в директорию скрипта в файл /usr/lib/zabbix/alertscripts/zbx_cookies ; файл с куками создается автоматически, если его нет; если юзер zabbix не сможет его создать, то получим ошибку при тесте отправки).
Для отправки графиков необходимо добавить вот такую строчку в любое место текста сообщения в нужных шаблонах сообщений (обычно это только тип Проблема ):
:1h:900:300>
- — родной макрос, куда попадает ID первого итема из выражения триггера;
- 1h — период, за который нужно получить график относительно текущего времени (может быть числом в секундах либо в относительных величинах: m — минуты, h — часы, d — дни, w — недели, M — месяцы, y — года);
- 900 — кастомная ширина графика;
- 300 — кастомная высота графика.
Ширина и высота необязательны. Если не указывать вообще или указать 0, то размеры будут те, которые указаны в настройках графика в веб-интерфейсе.
Для проверки отправки графиков необходимо вызвать срабатывание любого триггера, где для элемента данных создан график. К примеру, возьмем триггер перегруза CPU. Для этого нагрузим все ядра любого хоста, где активен этот триггер:
openssl speed -multi $(grep -ci processor /proc/cpuinfo)
Через какое-то время (в зависимости от порогов срабатывания триггера) получим алерт с графиком:
Также можно тестить отправку во встроенном тесте способа оповещени. Для этого добавим строку с данными графика в окошко теста ( нужно будет сменить на реальный ID итема, его можно взять из адресной строки из истории или страницы настройки этого итема) и тыкнуть по кнопке Тест :
В результате получим тестовое сообщение с графиком:
Для временного отключения графиков не нужно удалять строку с данными графика из шаблона оповещений. Достаточно только установить значение переменной GRAPHS в 0 . Эта строка удаляется из текста сообщения в любом случае.
Другие переменные скрипта
Во многих триггерах в описании триггера вывожу дополнительные данные и значения итемов в конце сообщения. Бывает полезно получать оперативные данные прямо в алерте. В некоторых шаблонах эти описания могут быть очень длинными (например, ошибки в логах веб-сервера), а у телеги есть ограничения по длине текста в обычных сообщениях (4096 символов) и подписям к изображениям (1024 символа).
Пробовал разбивать сообщения на несколько, но ломается markdown разметка, появляется мешанина из кучи сообщений (особенно если параллельно срабатывают несколько подобных триггеров), да и не особо бывает нужно видеть весь текст. В итоге просто сделал обрезку сообщений. Если сообщение длиньше установленных лимитов, то текст обрезается, а в конце добавляется многоточие.
Максимальная длина текстов задается в переменных скрипта:
- TELEGRAM_MESSAGE_LIMIT — макисмальная длина текстовых сообщений (по дефолту 4000 );
- TELEGRAM_CAPTION_LIMIT — максимальная длина подписей к графикам (по дефолту 900 );
Для лучшего восприятия сообщений описание чаще всего в шаблонах запихиваю в блоки кода (тройной апостроф по краям):
Started: Severity: Original problem ID: «` «`
Но при обрезке такого сообщения вместе с текстом обрежутся еще и закрывающие апострофы, а телега ругнется на такое сообщение и не отправит его. Для такого случая добавил переменную MONOSPACED_DESCRIPTION . Если она включена (значение 1 ), а очень длинное описание запихнуто в блок кода, то скрипт обрежет текст и корректно завершит блок кода.
Источник: zevilz.dev
ramer
1.2. Бота создали, токен получили, себе его сохранили.
1.4. Проверим работу бота. На сервере zabbix вводим команду:
# curl —header ‘Content-Type: application/json’ —request ‘POST’ —data » «https://api.telegram.org/ bot526250249:AAFtAqy4ln0BqK5vtU_9IoSlLdu htl8IaGg /sendMessage»
где
chat_id — id аккаунта или группы (групповой id начинается с -)
token — токен бота (впереди написать bot)
1.4.1. Если curl не установлен, то пишем команду apt-get install curl -y.
2. Скрипт для отправки оповещений.
2.1. Стандартная настройка для директории со скриптами, которые использует заббикс для отправки уведомлений — /usr/lib/zabbix/alertscripts.
#!/bin/sh token=’526250249:AAFtAqy4ln0BqK5vtU_9IoSlLduhtl8IaGg’ chat=»$1″ subj=»$2″ message=»$3″ /usr/bin/curl -s —header ‘Content-Type: application/json’ —request ‘POST’ —data «»,»text»:»$n$»>» «https://api.telegram.org/bot$/sendMessage»
2.2. Сохраняем (ctrl+O) и делаем скрипт исполняемым:
# chmod +x /usr/lib/zabbix/alertscripts/telegram.sh
2.3. Проверяем работу скрипта.
# /usr/lib/zabbix/alertscripts/telegram.sh 210806260 Тест ‘Проверяю отправку оповещений ботом из скрипта’
3. Настройка zabbix на отправку уведомлений.
3.1. В web-интерфейсе zabbix добавляем новый способ оповещения (Администрирование -> Способы оповещений -> Создать способ оповещений).
3.1.1. Заполняем все поля.
3.2. Добавляем новый способ оповещения пользователю (Администрирование -> Пользователи -> выбираем нужного -> Оповещения -> Добавить).
3.2.1. В поле «Отправлять на» вводим свой telegram id.
3.3. Настраиваем действие отправки (Настройка -> Действия). Можно настроить на конкретные триггеры.
3.3.1. Там же во вкладках «Операции» и «Операции восстановления» настраиваем условия.
Источник: ramer.livejournal.com