Добавить в корзинуПозвонить
Найти в Дзене

Python. Zabbix API. Узлы сети.

Спустя две статьи по api zabbix, я наконец готов рассказать о том функционале, из-за которого в принципе полез копаться в этой библиотеке. А задача изначально звучала просто - нужен список клиентов с нескольких серверов, с их ip адресами и активностью (активирован/деактивирован, онлайн/оффлайн). Сегодня будем запрашивать у сервера zabbix информацию о его клиентах. Официальную документацию можно посмотреть здесь. А мы сегодня будем разбирать конкретно один метод - host.get Почему именно так? Лично я предпочитаю добавлять и удалять клиентов вручную, дабы не получить каких-либо проблем в дальнейшем из-за небольшой ошибки (например, мы удаляем все выключенные узлы сети, а один важный внезапно "отвалился" по сети и стал недоступен). Также, массовое добавление клиентов в zabbix реализовано через network discovery: Массовое изменение макросов может и будет когда-нибудь полезно, но это скорее разовая операция, а, зная базу, не составит труда написать простенький скрипт. Как обычно, в начале вы

Спустя две статьи по api zabbix, я наконец готов рассказать о том функционале, из-за которого в принципе полез копаться в этой библиотеке. А задача изначально звучала просто - нужен список клиентов с нескольких серверов, с их ip адресами и активностью (активирован/деактивирован, онлайн/оффлайн).

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

Официальную документацию можно посмотреть здесь.

А мы сегодня будем разбирать конкретно один метод - host.get

Почему именно так? Лично я предпочитаю добавлять и удалять клиентов вручную, дабы не получить каких-либо проблем в дальнейшем из-за небольшой ошибки (например, мы удаляем все выключенные узлы сети, а один важный внезапно "отвалился" по сети и стал недоступен).

Также, массовое добавление клиентов в zabbix реализовано через network discovery:

Массовое изменение макросов может и будет когда-нибудь полезно, но это скорее разовая операция, а, зная базу, не составит труда написать простенький скрипт.

Начнем.

Как обычно, в начале вызываем метод host.get без каких-либо параметров:

-2

В ответ получим:

{'hostid': '10651', 'proxyid': '0', 'host': 'test-client', 'status': '0', 'ipmi_authtype': '-1', 'ipmi_privilege': '2', 'ipmi_username': '', 'ipmi_password': '', 'maintenanceid': '0', 'maintenance_status': '0', 'maintenance_type': '0', 'maintenance_from': '0', 'name': 'test-client', 'flags': '0', 'templateid': '0', 'description': '', 'tls_connect': '1', 'tls_accept': '1', 'tls_issuer': '', 'tls_subject': '', 'custom_interfaces': '0', 'uuid': '', 'vendor_name': '', 'vendor_version': '', 'proxy_groupid': '0', 'monitored_by': '0', 'inventory_mode': '-1', 'active_available': '0', 'assigned_proxyid': '0'}
{'hostid': '10084', 'proxyid': '0', 'host': 'Zabbix server', 'status': '0', 'ipmi_authtype': '-1', 'ipmi_privilege': '2', 'ipmi_username': '', 'ipmi_password': '', 'maintenanceid': '0', 'maintenance_status': '0', 'maintenance_type': '0', 'maintenance_from': '0', 'name': 'Zabbix server', 'flags': '0', 'templateid': '0', 'description': '', 'tls_connect': '1', 'tls_accept': '1', 'tls_issuer': '', 'tls_subject': '', 'custom_interfaces': '0', 'uuid': '', 'vendor_name': '', 'vendor_version': '', 'proxy_groupid': '0', 'monitored_by': '0', 'inventory_mode': '1', 'active_available': '1', 'assigned_proxyid': '0'}

Тот же самый вывод будет, если мы передадим методу параметр hostids=None.

Теперь разберемся с фильтрами:

  • hostids - список ID клиентов (узлов сети). Можно передать строку с одним конкретным хостом, можно список строк, можно None.
hostids=None - отдаст все узлы сети
hostids='10084' - отдаст узел сети с указанным ID
hostids=['10651', '10084'] - отдаст 2 указанных узла сети.

По сути, мы получили краткую сводку о узле сети, которую можем проверить в web сервера:

-3

Но в выводе выше мы не видим, какой IP адрес у клиента. Все потому, что мы не запросили у него список интерфейсов.

  • selectInterfaces - флаг, отвечающий за добавление информации о прикрепленных интерфейсах к узлу сети.
-4

В выводе мы увидим появившийся ключ interfaces:

'interfaces': [{'interfaceid': '31', 'hostid': '10651', 'main': '1', 'type': '1', 'useip': '1', 'ip': '192.168.122.196', 'dns': '', 'port': '10050', 'available': '1', 'error': '', 'errors_from': '0', 'disable_until': '0', 'details': []}]

Но флаг "extend" выдает абсолютно всю информацию. Поэтому добавим фильтр:

-5

И вывод станет более лаконичным:

'interfaces': [{'ip': '192.168.122.196', 'port': '10050', 'available': '1'}]

  • selectInventory - флаг, отвечающий за данные инвентаризации:
-6

Поскольку полей в инвентаризации слишком много, сразу запросим их с фильтром:

-7

В выводе добавится ключ inventory:

'inventory': {'name': 'test-client', 'os': 'Debian 12'}

  • selectGroups - флаг, отвечающий за группы узла сети:
-8
-9

В вывод добавится:

'groups': [{'groupid': '2', 'name': 'Linux servers', 'flags': '0', 'uuid': 'dc579cd7a1a34222933f24f52a68bcd8'}]

Поскольку для работы с хостами не все нам нужно, оставим только groupid и name:

-10

  • selectParentTemplates - фильтр, отвечающий за прикрепленные к узлу сети шаблоны:
-11

Для простоты оставим в выводе только ID и имя шаблона:

-12

И в вывод добавится:

'parentTemplates': [{'templateid': '10001', 'name': 'Linux by Zabbix agent'}]

Теперь нам осталось только отфильтровать вывод самого метода host.get.

  • output - флаг, отвечающий за вывод изначальной информации метода.

Как вы помните, мы получаем слишком много лишних параметров (например, о ipmi, шифровании и т.д.). Добавим фильтр:

-13
zabbix_clients = zabbix_api.host.get(hostids='10651',
selectInterfaces=['ip', 'port', 'available'],
selectInventory=['name', 'os'],
selectGroups=['groupid', 'name'],
selectParentTemplates=['templateid', 'name'],
output=['hostid', 'host', 'status', 'name', 'description', 'inventory_mode'])

Конечный вывод будет таким:

{'hostid': '10651', 'host': 'test-client', 'status': '0', 'name': 'test-client', 'description': '', 'inventory_mode': '0',
'parentTemplates': [{'templateid': '10001', 'name': 'Linux by Zabbix agent'}],
'groups': [{'groupid': '2', 'name': 'Linux servers'}],
'inventory': {'name': 'test-client', 'os': 'Debian 12'},
'interfaces': [{'ip': '192.168.122.196', 'port': '10050', 'available': '1'}]}

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