Спустя две статьи по api zabbix, я наконец готов рассказать о том функционале, из-за которого в принципе полез копаться в этой библиотеке. А задача изначально звучала просто - нужен список клиентов с нескольких серверов, с их ip адресами и активностью (активирован/деактивирован, онлайн/оффлайн).
Сегодня будем запрашивать у сервера zabbix информацию о его клиентах.
Официальную документацию можно посмотреть здесь.
А мы сегодня будем разбирать конкретно один метод - host.get
Почему именно так? Лично я предпочитаю добавлять и удалять клиентов вручную, дабы не получить каких-либо проблем в дальнейшем из-за небольшой ошибки (например, мы удаляем все выключенные узлы сети, а один важный внезапно "отвалился" по сети и стал недоступен).
Также, массовое добавление клиентов в zabbix реализовано через network discovery:
Массовое изменение макросов может и будет когда-нибудь полезно, но это скорее разовая операция, а, зная базу, не составит труда написать простенький скрипт.
Начнем.
Как обычно, в начале вызываем метод host.get без каких-либо параметров:
В ответ получим:
{'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 сервера:
Но в выводе выше мы не видим, какой IP адрес у клиента. Все потому, что мы не запросили у него список интерфейсов.
- selectInterfaces - флаг, отвечающий за добавление информации о прикрепленных интерфейсах к узлу сети.
В выводе мы увидим появившийся ключ 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" выдает абсолютно всю информацию. Поэтому добавим фильтр:
И вывод станет более лаконичным:
'interfaces': [{'ip': '192.168.122.196', 'port': '10050', 'available': '1'}]
- selectInventory - флаг, отвечающий за данные инвентаризации:
Поскольку полей в инвентаризации слишком много, сразу запросим их с фильтром:
В выводе добавится ключ inventory:
'inventory': {'name': 'test-client', 'os': 'Debian 12'}
- selectGroups - флаг, отвечающий за группы узла сети:
В вывод добавится:
'groups': [{'groupid': '2', 'name': 'Linux servers', 'flags': '0', 'uuid': 'dc579cd7a1a34222933f24f52a68bcd8'}]
Поскольку для работы с хостами не все нам нужно, оставим только groupid и name:
- selectParentTemplates - фильтр, отвечающий за прикрепленные к узлу сети шаблоны:
Для простоты оставим в выводе только ID и имя шаблона:
И в вывод добавится:
'parentTemplates': [{'templateid': '10001', 'name': 'Linux by Zabbix agent'}]
Теперь нам осталось только отфильтровать вывод самого метода host.get.
- output - флаг, отвечающий за вывод изначальной информации метода.
Как вы помните, мы получаем слишком много лишних параметров (например, о ipmi, шифровании и т.д.). Добавим фильтр:
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 сервера.