Делая решение для клиента, возникли 2 проблемы, которые хотелось решить красиво и стандартным функционалом Zabbix. Задание 1. Мониторинг текущей версии прошивки на роутерах Микротик.
Проблему легко решить, добавив в шаблон HTTP-агент. Агент получает актуальную версию с сайта Микротика, а триггер сравнивает текущую версию с текущей и в случае несоответствия выдает оповещение.
Когда у вас 10 роутеров, такой алгоритм не критичен, но что делать с 3000 роутерами? Отправить 3000 запросов на сервер? Конечно, такая схема работала бы, но идея с 3000 запросами меня не устраивала, хотелось найти другое решение.
Кроме того, в таком алгоритме все же был недостаток: такое количество запросов с одного IP другая сторона могла посчитать как DoS-атаку, и вас могли просто забанить.
Задача 2. Использование сеансов авторизации в разных HTTP-агентах.
Когда вам необходимо получать информацию с «закрытых» страниц через HTTP-агент, вам необходим авторизационный cookie. Для этого обычно существует стандартная форма авторизации с парой «логин/пароль» и установкой идентификатора сессии в куки.
Но есть проблема: вы не можете получить доступ к данным другого элемента из одного элемента HTTP-агента, чтобы подставить это значение в Заголовок.
Еще есть «Веб-скрипт», у него другое ограничение; он не позволяет получать контент для анализа и дальнейшего сохранения.
Вам остается только проверять наличие необходимых переменных на страницах или передавать ранее полученные переменные между шагами веб-скрипта.
Немного подумав над этими задачами, я решил использовать макросы, которые хорошо видны в любой части системы мониторинга: в шаблонах, хостах, триггерах или элементах.
А обновить макросы можно через API веб-интерфейса.
Zabbix имеет хорошую и подробную документацию по API. Для обмена данными через API используется формат данных Json. Подробно вы можете прочитать в официальная документация .
Последовательность действий по получению нужных нам данных и записи их в макрос представлена на схеме ниже.
Шаг 1
Самый первый шаг может состоять из одного действия или из нескольких действий.Первые шаги содержат всю основную логику, а последние 3 шага являются основными.
В моем примере первым шагом было получение авторизационного куки на АТС для первой задачи.
По второй задаче я получил текущий номер версии прошивки Микротика.
URL текущих версий прошивок Mikrotik
- update.mikrotik.com/routeros/LATEST.6 — URL-адрес текущей стабильной версии.
- update.mikrotik.com/routeros/LATEST.6fix — URL-адрес текущей версии LTS.
Первый шаг совершенно индивидуален для каждого случая и логика его работы может быть разной.
Все зависит от вашей задачи.
При работе с веб-скриптами следите за тем, каким методом вам нужно получить ответ. Заголовки 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;Для работы с API я создал отдельный аккаунт с ограниченными правами.
- метод — метод, который вызывается;
- params — параметры, передаваемые методом;
- id — произвольный идентификатор запроса;
- auth — ключ аутентификации пользователя; Поскольку у нас его еще нет, мы установим его равным нулю.
Во-первых, нет необходимости давать доступ к местам, где он не нужен.
А во-вторых, до версии 5.0 можно было прочитать пароль, указанный через макрос.
Соответственно, если вы используете пароль администратора Zabbix, учетную запись администратора можно легко украсть.
Особенно это будет актуально, когда вы работаете с API через сторонние скрипты и храните учетные данные на стороне.
Начиная с версии 5.0 появилась возможность скрыть пароль, сохраненный в макросе.
При создании отдельной учетной записи для обновления данных через API обязательно проверьте, доступны ли нужные вам данные через веб-интерфейс и можно ли их обновить.
Я не проверял, а потом долго не мог понять, почему нужный мне макрос не виден через API.
После того, как мы получили авторизацию в API, приступаем к получению списка макросов.
Шаг 3
Интерфейс API не позволяет обновлять макрос хоста по имени; для этого необходимо сначала получить идентификатор макроса.Более того, чтобы получить список макросов для конкретного хоста, нужно узнать ID этого хоста, а это дополнительный запрос.
Используйте стандартный макрос {ХОСТ.
ИД} в запросе это невозможно.
Я решил обойти это ограничение следующим образом:
Я создал локальный макрос с идентификатором этого хоста.
Узнать идентификатор хоста через веб-интерфейс очень легко.
Ответ со списком всех макросов для данного хоста можно отфильтровать по шаблону: regex:{"hostmacroid":"([0-9]+)"[A-z0-9,":]+"{\$MIKROTIK_VERSION}"
Таким образом, мы получаем идентификатор нужного нам макроса, где 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
-
Отчеты О Продажах Android Маркета
19 Oct, 24 -
Silverlight 2.0 Выйдет В Начале 2008 Г.
19 Oct, 24 -
Проблемы С Оптимизатором Mysql
19 Oct, 24