Продолжаю работу по переводу шаблонов на пятую версию Zabbix. Сегодня дописал третью версию шаблона для мониторинга срока действия доменов. Мониторим в Linux.
Новую версия полностью переработал. Получилось следующее:
- Существенно уменьшено количество файлов. Для работы шаблона достаточно самого шаблона, одного скрипта и одного конфигурационного файла с пользовательскими переменными.
- Механизм crontab больше не используется для получения данных доменов.
- Международные доменные имена (IDN) поддерживаются, например, "испытание.рф".
- Добавлена возможность указать название домена, которое вместе с доменным именем используется в триггеров.
- Кроме срока действия домена отслеживаются дополнительные данные.
- Все данные домена получаются одним запросом, скрипт можно использовать для просмотра данных домена из Linux.
- Тайминги настраиваются в макросах шаблона.
- И самое главное, список проверяемых доменов можно менять в самом шаблоне, он больше не хранится на хосте. Для получения данных доменов используется низкоуровневое обнаружение.
Механизм получения данных домена основан на работе утилиты whois.
whois — сетевой протокол на основе протокола TCP. Его основное предназначение: получение в текстовом виде регистрационных данных о владельцах IP адресов и доменных имен.
Работа whois описана в RFC 3912 http://tools.ietf.org/html/rfc3912. Открываем TCP соединение на 43 порт к нужному whois серверу, посылаем запрос в определенном формате, который зависит от конкретного whois сервера, заканчиваем запрос "\r\n" и получаем результат, формат которого также зависит от конкретного whois сервера. Получается что мы куда-точто-то и получаем в ответ нечто.
Из-за того, что результат выдачи whois сервера может в любой момент измениться, я не гарантирую правильность работы скрипта. Используйте на свой страх и риск и не забывайте вовремя оплачивать домены.
Скрипт протестирован в зонах: RU NET.RU ORG.RU PP.RU SPB.RU MSK.RU РФ INFO RE ORG COM NET TW OOO SHOP. Есть шанс что в каких-то других зонах тоже будет работать.
Я подобрал несколько whois серверов к тем доменным зонам, которые мне были нужны и постарался распарсить основные данные домена, которые мне могли пригодиться:
- Название регистратора
- NS сервера
- Дата создания домена
- Дата истечения срока оплаты домена
- Количество дней до истечения срока оплаты домена
Сознательно не стал собирать контактные данные владельца домена, потому как мониторинг мне нужен не для этого.
Плюс 9 триггеров, отслеживающих срок действия домена, смену регистратора и NS серверов. Один триггер срабатывает в том случае, если элемент перестаёт получать данные.
Установка шаблона
Скачать шаблон для Zabbix 5.0: zbx5_domain_check.zip.
В качестве хоста я использую сам Zabbix сервер, привязываю шаблон к нему. На хосте (у меня Ubuntu) устанавливаю необходимый для работы скрипта пакет whois:
apt-get install whois
Копируем domain_check.conf в папку с пользовательскими переменными, у меня это /etc/zabbix/zabbix_agentd.conf.d/domain_check.conf. Не забываем про владельца и права:
chown root\: /etc/zabbix/zabbix_agentd.conf.d/domain_check.conf
chmod 644 /etc/zabbix/zabbix_agentd.conf.d/domain_check.conf
Копируем папку со скриптом в /etc/zabbix/scripts/. В ней у нас:
- /etc/zabbix/scripts/domain_check.sh
Не забываем про владельца и права:
chown -R root\: /etc/zabbix/scripts
chmod a+x /etc/zabbix/scripts/*
Перезапускаем агент:
service zabbix-agent restart
Можно проверить работу скрипта:
cd /etc/zabbix/scripts
./domain_check.sh "Проверка" "internet-lab.ru"
Импортируем шаблон zbx5_domain_check.xml.
В макросах шаблона можно отредактировать периодичность опроса данных:
- {$DOMAIN_DISCOVERY_PERIOD} — 6h. Периодичность автообнаружения доменов.
- {$DOMAIN_HISTORY_PERIOD} — 180d. Срок хранения истории. У меня не работает, берётся значение из Zabbix. Оставил, вдруг в какй-то из версий будет работать.
- {$DOMAIN_NODATA_PERIOD} — 1d. Когда поднимать панику, если данных домена нет.
- {$DOMAIN_REQUEST_PERIOD} — 6h. Периодичность опроса доменов.
- {$DOMAIN_TREND_PERIOD} — 180d. Срок хранения трендов.
Список проверяемых доменов
Находим шаблон в Configuration → Templates. Я назвал шаблон Domain check.
Переходим в items. Здесь всего один элемент данных под названием Domain list.
Кликаем по нему.
Выбираем вкладку Preprocessing.
Здесь один шаг препроцессинга JavaScript. Нажимаем на его параметр.
А вот и список доменов в формате JSON. Здесь его можно отредактировать и указать свой список. Формат списка:
var DomainList = {
"data": [
{"{#NAME}": "Сисадминам internet-lab.ru", "{#DOMAIN}": "internet-lab.ru"},
{"{#NAME}": "Пиццерия setpizza.com", "{#DOMAIN}": "setpizza.com"},
{"{#NAME}": "Карты cardmoney.net", "{#DOMAIN}": "cardmoney.net"},
{"{#NAME}": "Банк masterbank.net", "{#DOMAIN}": "masterbank.net"},
{"{#NAME}": "Спорт sportmaster.info", "{#DOMAIN}": "sportmaster.info"}
] };
return JSON.stringify(DomainList)
Для каждого проверяемого домена указывается:
- {#NAME} — название. Любое название, применяется в именах триггеров. Обязательный параметр.
- {#DOMAIN} — домен. Можно в формате IDN, например, на кириллице. Обязательный параметр.
Примечание
Если приходится часто проверять срок действия доменов, то можно вынести скрипт на отдельный хост. То же самое, если доменов очень много.
Если домены не входят в один JSON, то можно сделать несколько шаблонов с разными именами и разным набором проверяемых доменов.
Данные исключённых из списка доменов удаляются через 30 дней согласно правилам низкоуровневого обнаружения LLD.
Триггеры, отслеживающие срок действия домена, настроены на 30, 14, 7, 1, 0- дней.
Значение {$DOMAIN_NODATA_PERIOD} должно превышать {$DOMAIN_REQUEST_PERIOD}, иначе сработает триггер, отслеживающий отсутствие данных домена.
Update
Версия 4. Иногда whois данные не отдаёт, в этом случае элемент данных domain.check.days["internet-lab.ru"] сбрасывается в 0 и ложно срабатывает триггер "Domain internet-lab.ru expires today". Теперь триггер проверяет сумму последних двух значений.
Версия 5. В четвёртой версии устранено ложное срабатывание триггера "Domain internet-lab.ru expires today", но стали срабатывать другие зависимые. Исправил.
Версия 6.
- Исправлена опечатка в прототипе элемента даных days: {$DOMAN_TREND_PERIOD} на {$DOMAIN_TREND_PERIOD}, спасибо cuttys в канале Телеграм.
- Исправлено возможное появление двойных кавычек в названии регистратора, спасибо Фёдору Григорову в комментариях VK.
- Выброшены ненужные куски кода для зон SHOP и OOO.
- Добавлен обход ложных срабатываний триггеров когда whois сервера заняты с ошибкой "Server is busy now, please try again later."