Проверяем Zabbix (Episode II)

Да будет слушающий услышан, ибо из немоты его проистекают семь казней египетских на головы SRE team

14 февраля 2020

Проверяем Zabbix (Episode II)

Наш предыдущий рецепт для проверки Zabbix-сервера содержит неочевидный, но важный изъян.

Он контролирует, что Zabbix-сервер жив и доступен из Интернета, но упускает существенную деталь:
успешные ответы Zabbix-сервера на запросы извне отнюдь не означают, что Zabbix-сервер может обратиться наружу.

Например, обращения к серверу Telegram или SMTP-серверам обычно производится по DNS-имени.
Если DNS отказывает — обратиться к ним Zabbix не сможет, хотя всё остальное в нём продолжит работать нормально.

В результате мы не узнаем от него об авариях в те моменты, когда не смотрим в Веб-интерфейс.

Поэтому Zabbix-сервер (или дополнительный костыль на нём) обязан:

  • регулярно проверять работоспособность используемых инструментов оповещения;
  • и информировать внешний мониторинг о результатах проверки.

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

Для Telegram достаточно убедиться, что https://api.telegram.org (а) открывается, (б) имеет корректный сертификат и (в) возвращает редирект на сайт с документацией:

nn="$(curl -sS -v https://api.telegram.org/ 2>&1 |
    egrep -c '^. (HTTP/1.1 302 Moved Temporarily|Location: https://core.telegram.org/bots)')"
test "$nn" = "2" && echo "Telegram OK" || echo "Telegram failure"

Поскольку наша проверка будет запускаться извне как Веб-страница, перепишем её на PHP и сохраним в файл /usr/share/zabbix/TGCheck-секретный-суффикс.php:

<?php

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'https://api.telegram.org/');
curl_setopt($ch, CURLOPT_NOBODY, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);

curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);

printf("%s,%s", $info['http_code'], $info['redirect_url']);

Поскольку написанная на PHP часть Zabbix'a не использует cURL, то соответствующий пакет вряд ли установлен и его потребуется установить сейчас:

apt install php-curl
apachectl graceful

В завершение добавим проверку во внешний мониторинг:

  • URL = zabbix.наша-фирма.ru/TGCheck-секретный-суффикс.php
  • Требуемая строка = 302,https://core.telegram.org/bots

Мы используем cookie, чтобы сделать сайт удобнее