Zabbix — Расширение Границ Макросов

Делая решение для клиента, возникли 2 проблемы, которые хотелось решить красиво и стандартным функционалом Zabbix. Задание 1. Мониторинг текущей версии прошивки на роутерах Микротик.

Проблему легко решить, добавив в шаблон HTTP-агент. Агент получает актуальную версию с сайта Микротика, а триггер сравнивает текущую версию с текущей и в случае несоответствия выдает оповещение.

Когда у вас 10 роутеров, такой алгоритм не критичен, но что делать с 3000 роутерами? Отправить 3000 запросов на сервер? Конечно, такая схема работала бы, но идея с 3000 запросами меня не устраивала, хотелось найти другое решение.

Кроме того, в таком алгоритме все же был недостаток: такое количество запросов с одного IP другая сторона могла посчитать как DoS-атаку, и вас могли просто забанить.

Задача 2. Использование сеансов авторизации в разных HTTP-агентах.

Когда вам необходимо получать информацию с «закрытых» страниц через HTTP-агент, вам необходим авторизационный cookie. Для этого обычно существует стандартная форма авторизации с парой «логин/пароль» и установкой идентификатора сессии в куки.

Но есть проблема: вы не можете получить доступ к данным другого элемента из одного элемента HTTP-агента, чтобы подставить это значение в Заголовок.

Еще есть «Веб-скрипт», у него другое ограничение; он не позволяет получать контент для анализа и дальнейшего сохранения.

Вам остается только проверять наличие необходимых переменных на страницах или передавать ранее полученные переменные между шагами веб-скрипта.

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

А обновить макросы можно через API веб-интерфейса.

Zabbix имеет хорошую и подробную документацию по API. Для обмена данными через API используется формат данных Json. Подробно вы можете прочитать в официальная документация .

Последовательность действий по получению нужных нам данных и записи их в макрос представлена на схеме ниже.



Zabbix — расширение границ макросов



Шаг 1

Самый первый шаг может состоять из одного действия или из нескольких действий.

Первые шаги содержат всю основную логику, а последние 3 шага являются основными.

В моем примере первым шагом было получение авторизационного куки на АТС для первой задачи.

По второй задаче я получил текущий номер версии прошивки Микротика.

URL текущих версий прошивок Mikrotik

К этим адресам обращается само оборудование Микротик при получении последней доступной версии прошивки.

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

Все зависит от вашей задачи.

При работе с веб-скриптами следите за тем, каким методом вам нужно получить ответ. Заголовки HTTP-ответ или только тело ответ без заголовков? Если вам нужны авторизационные куки, то установите метод ответа Заголовки как и в случае с Астериском.

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



Шаг 2

Перейдем ко второму шагу.

Получение сеанса авторизации:

  
  
  
   

POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1 Content-Type: application/json-rpc { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "Admin" "password": "zabbix" }, "id": 1, "auth": null }

jsonrpc — версия используемого протокола JSON-RPC; Zabbix реализует JSON-RPC версии 2.0;
  • метод — метод, который вызывается;
  • params — параметры, передаваемые методом;
  • id — произвольный идентификатор запроса;
  • auth — ключ аутентификации пользователя; Поскольку у нас его еще нет, мы установим его равным нулю.

Для работы с API я создал отдельный аккаунт с ограниченными правами.

Во-первых, нет необходимости давать доступ к местам, где он не нужен.

А во-вторых, до версии 5.0 можно было прочитать пароль, указанный через макрос.

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

Особенно это будет актуально, когда вы работаете с API через сторонние скрипты и храните учетные данные на стороне.

Начиная с версии 5.0 появилась возможность скрыть пароль, сохраненный в макросе.



Zabbix — расширение границ макросов

При создании отдельной учетной записи для обновления данных через API обязательно проверьте, доступны ли нужные вам данные через веб-интерфейс и можно ли их обновить.

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

Zabbix — расширение границ макросов

После того, как мы получили авторизацию в API, приступаем к получению списка макросов.



Шаг 3

Интерфейс API не позволяет обновлять макрос хоста по имени; для этого необходимо сначала получить идентификатор макроса.

Более того, чтобы получить список макросов для конкретного хоста, нужно узнать ID этого хоста, а это дополнительный запрос.

Используйте стандартный макрос {ХОСТ.

ИД} в запросе это невозможно.

Я решил обойти это ограничение следующим образом:

Zabbix — расширение границ макросов

Я создал локальный макрос с идентификатором этого хоста.

Узнать идентификатор хоста через веб-интерфейс очень легко.

Ответ со списком всех макросов для данного хоста можно отфильтровать по шаблону:

regex:{"hostmacroid":"([0-9]+)"[A-z0-9,":]+"{\$MIKROTIK_VERSION}"



Zabbix — расширение границ макросов

Таким образом, мы получаем идентификатор нужного нам макроса, где MIKROTIK_VERSION — имя искомого макроса.

В моем случае ищется макрос MIKROTIK_VERSION , который был назначен узлу.

Сам запрос выглядит так:

POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1 Content-Type: application/json-rpc { "jsonrpc":"2.0", "method":"usermacro.get", "params":{ "output":"extend", "hostids":"{$HOST_ID}" }, "auth":"{sid}", "id":1 }

Переменная {сид} полученный на втором этапе и будет использоваться постоянно там, где нужно работать с интерфейсом API.

Финальный 4 ШАГ — обновление макроса

Теперь мы знаем идентификатор макроса, который необходимо обновить, авторизационный куки или версию прошивки роутера.

Вы можете обновить сам макрос.



POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1 Content-Type: application/json-rpc { "jsonrpc":"2.0", "method":"usermacro.update", "params":{ "hostmacroid":"{hostmacroid}", "value":"{mikrotik_version}" }, "auth":"{sid}", "id":1 }

{mikrotik_version} — значение, полученное на первом этапе.

В моем примере версия текущей прошивки микротика {хостмаккроид} — значение получено на третьем шаге — id макроса, который мы обновляем.



выводы

Подход к решению проблемы с использованием стандартного функционала в разы сложнее и занимает больше времени.

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

Очевидным преимуществом такого подхода является «переносимость» решения между разными серверами.

Лично для меня странно, что HTTP-агент не имеет возможности получить доступ к данным из другого элемента и подставить их в тело запроса или заголовки[ ZBXNEXT-5993 ].

Готовый шаблон можно скачать на GitHub .

Теги: #it-инфраструктура #Системное администрирование #открытый исходный код #Администрирование серверов #zabbix api mikrotik

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.