Как организовать подключение к Zabbix
Что проверяют
Понимаете ли вы, что к Zabbix подключаются с разными целями и разными способами: управлять и читать данные через API, отправлять метрики через trapper, опрашивать агента. Следом спрашивают про аутентификацию без пароля в коде и про обработку ошибок JSON-RPC.
Как отвечать
Уточните задачу, потом выбирайте канал:
- JSON-RPC API: точка входа
https://<сервер>/api_jsonrpc.php, методыhost.get,item.get,history.get,problem.get. Для выгрузки данных и автоматизации хостов и шаблонов; - trapper: приложение само отправляет значения на сервер или прокси (порт 10051) в элемент типа «Zabbix trapper». Удобно для бизнес-метрик и итогов батч-задач;
- агент:
UserParameterв конфигурации агента запускает ваш скрипт, сервер опрашивает агента как обычно.
Из Python удобнее всего официальная библиотека zabbix_utils: ZabbixAPI для API, Sender для trapper, Getter для опроса агента, есть асинхронный AsyncZabbixAPI. Сторонняя pyzabbix тоже работает, а голый requests оправдан для пары вызовов.
Аутентификация: вместо логина и пароля заведите API-токен в интерфейсе Zabbix под отдельного пользователя с минимальными правами и передавайте его в заголовке Authorization: Bearer <токен>. Сам токен берите из переменной окружения или хранилища секретов. Если всё же вызываете user.login, в конце делайте user.logout, иначе на сервере копятся сессии.
Тяжёлые запросы ограничивайте: output только с нужными полями, limit, фильтр по времени в history.get.
Где спотыкаются
Проверяют только HTTP-статус. JSON-RPC отвечает 200 и на ошибку, описание лежит в поле error, а код вида response.json().get("result") молча возвращает None вместо понятного исключения.
Не ставят таймаут. requests по умолчанию ждёт бесконечно, и зависший Zabbix вешает вашу задачу вместе с собой.
Не учитывают версию сервера. API меняется между мажорными релизами: параметр user в user.login заменён на username, поле auth в теле запроса уступает место заголовку. Пример из старой статьи на свежем сервере может не заработать.