Рубрики
syslog \ rsyslog \ zabbix

zabbix api \ python \ получение данных из zabbix \ создание host\item\trigger в zabbix

Ссылки:

https://www.zabbix.com/documentation/current/manual/api/changes_5.2_-_5.4

https://www.zabbix.com/ru/zabbix_api
https://www.zabbix.com/documentation/current/ru/manual/api
https://www.zabbix.com/documentation/current/ru/manual/api/reference/host/get
https://www.zabbix.com/documentation/current/ru/manual/api/reference
https://www.zabbix.com/documentation/current/ru/manual/api/reference/trigger
https://www.zabbix.com/documentation/current/ru/manual/api/reference/trigger/get
https://www.zabbix.com/documentation/current/ru/manual/web_interface/frontend_sections/monitoring/problems
https://www.zabbix.com/documentation/current/ru/manual/api/reference/problem/get
https://www.zabbix.com/documentation/current/manual/api/reference/problem/get
https://www.zabbix.com/documentation/current/ru/manual/api/reference/event/get


https://pypi.org/project/py-zabbix/
https://github.com/adubkov/py-zabbix
https://py-zabbix.readthedocs.io/en/latest/api.html
https://habr.com/ru/post/325876/
https://catonrug.blogspot.com/2018/07/learning-python-because-of-zabbix-api.html
Getting started with Zabbix API
https://www.jsonrpc.org/specification https://www.json.org/json-en.html

Python, JSON со структурой

{
      'host': 'Hostname'
      'groups': [...]
      'interfaces': [{},{},{}]
      'inventory': {}
      'templates': [{},{},{}]
      'inventory_mode': '1'
      'proxy_hostid': 'INT'
      'status': '0'
}

[] - массив \ список
{} - словарь


Python настройка подключения к серверу zabbix:

from pyzabbix.api import ZabbixAPI

# Переменные
ZABBIXURL = 'http://URL/zabbix/'
ZABBIXAPIUSER = 'USER '
ZABBIXAPIPASSWORD = 'PASSWORD'

# Создаем инстанс zapi
# Будем применять для дальнейших операций 
zapi = ZabbixAPI(url=ZABBIXURL, user=ZABBIXAPIUSER, password=ZABBIXAPIPASSWORD)

# Завершаем подключения 
zapi.user.logout()

Пример №1 Печатаем список хостов

from pyzabbix.api import ZabbixAPI

# Переменные
ZABBIXURL = 'http://URL/zabbix/'
ZABBIXAPIUSER = 'USER'
ZABBIXAPIPASSWORD = 'PASSWORD'

# Создаем инстанс zapi
# Будем применять для дальнейших операций 
zapi = ZabbixAPI(url=ZABBIXURL, user=ZABBIXAPIUSER, password=ZABBIXAPIPASSWORD)

# Добываем информацию узлы
# monitored_host - "флаг" - Возврат узлов сети только под наблюдением.
result1 = zapi.host.get(monitored_hosts=1, output='extend')

# Формируем список
hostnames1 = [host['host'] for host in result1]
# Если нужно можем распечатать список
# print(hostnames1)
# Печатаем список хостов красиво
for i in hostnames1:
     print(i)

# Завершаем подключения 
zapi.user.logout()

Пример №2 Печатаем список хостов

from pyzabbix.api import ZabbixAPI

# Переменные
ZABBIXURL = 'http://URL/zabbix/'
ZABBIXAPIUSER = 'USER'
ZABBIXAPIPASSWORD = 'PASSWORD'

# Создаем инстанс zapi
# Будем применять для дальнейших операций 
zapi = ZabbixAPI(url=ZABBIXURL, user=ZABBIXAPIUSER, password=ZABBIXAPIPASSWORD)

#Печатаем список узлов пример 1
for host in zapi.host.get(output = ['hostid','host','name'],  selectInterfaces=['ip','port','dns']):
    print (host)
  
#Печатаем список узлов пример 2
host_and_ip = zapi.host.get(output = ['hostid','host','name'],  selectInterfaces=['ip','port','dns'])
for i in host_and_ip:
   # print(i)
    print(i['host'], i['name'], i['interfaces'])

# Завершаем подключения 
zapi.user.logout()

Пример №3 Печатаем список групп

from pyzabbix.api import ZabbixAPI

# Переменные
ZABBIXURL = 'http://URL/zabbix/'
ZABBIXAPIUSER = 'USER'
ZABBIXAPIPASSWORD = 'PASSWORD'

# Создаем инстанс zapi
# Будем применять для дальнейших операций 
zapi = ZabbixAPI(url=ZABBIXURL, user=ZABBIXAPIUSER, password=ZABBIXAPIPASSWORD)


print(f" \nПечатаем список групп:")
groups = zapi.hostgroup.get(output=['itemid','name'])
for group in groups:
        print (group['groupid'],group['name'])


# Завершаем подключения 
zapi.user.logout()

Пример №4 Печатаем список хостов из группы

from pyzabbix.api import ZabbixAPI

# Переменные
ZABBIXURL = 'http://URL/zabbix/'
ZABBIXAPIUSER = 'USER'
ZABBIXAPIPASSWORD = 'PASSWORD'

# Создаем инстанс zapi
# Будем применять для дальнейших операций 
zapi = ZabbixAPI(url=ZABBIXURL, user=ZABBIXAPIUSER, password=ZABBIXAPIPASSWORD)


print(f" \nПечатаем список групп:")
groups = zapi.hostgroup.get(output=['itemid','name'])
for group in groups:
        print (group['groupid'],group['name'])

print(f" \nПолучаем список хостов в группе с id 2")
hosts = zapi.host.get(groupids=2, output=['hostid','name'])
for host in hosts:
        print (host['hostid'],host['name'])

# Завершаем подключения 
zapi.user.logout()

Пример №5 Печатаем список item

from pyzabbix.api import ZabbixAPI

# Переменные
ZABBIXURL = 'http://URL/zabbix/'
ZABBIXAPIUSER = 'USER '
ZABBIXAPIPASSWORD = 'PASSWORD'

# Создаем инстанс zapi
# Будем применять для дальнейших операций 
zapi = ZabbixAPI(url=ZABBIXURL, user=ZABBIXAPIUSER, password=ZABBIXAPIPASSWORD)

#Получаем список item с хоста c id 10268
print(f" \nПолучаем список item с хоста c id 10268")
items = zapi.item.get(hostids=10268, output=['itemid','name'])
for item in items:
        print (item['itemid'],item['name'])

# Завершаем подключения 
zapi.user.logout()

Пример №6 Печатаем triggers

from pyzabbix.api import ZabbixAPI

# Переменные
ZABBIXURL = 'http://URL/zabbix/'
ZABBIXAPIUSER = 'USER'
ZABBIXAPIPASSWORD = 'PASSWORD'

# Создаем инстанс zapi
# Будем применять для дальнейших операций 
zapi = ZabbixAPI(url=ZABBIXURL, user=ZABBIXAPIUSER, password=ZABBIXAPIPASSWORD)

# Получить список всех проблем (триггеры сработали)
triggers = zapi.trigger.get(only_true=1,
                            skipDependent=1,
                            monitored=1,
                            active=1,
                            output='extend',
                            expandDescription=1,
                            selectHosts=['host'],
                            )

# Получить список какие проблемы не подтверждены.
unack_triggers = zapi.trigger.get(only_true=1,
                                  skipDependent=1,
                                  monitored=1,
                                  active=1,
                                  output='extend',
                                  expandDescription=1,
                                  selectHosts=['host'],
                                  withLastEventUnacknowledged=1,
                                  )


unack_trigger_ids = [t['triggerid'] for t in unack_triggers]
for t in triggers:
    t['unacknowledged'] = True if t['triggerid'] in unack_trigger_ids \
        else False

# Распечатать список, содержащий только "сработавшие" триггеры
print (f"\n печатаем триггеры")
for t in triggers:
    if int(t['value']) == 1:
        print("{0} - {1} {2}".format(t['hosts'][0]['host'],
                                     t['description'],
                                     '(Unack)' if t['unacknowledged'] else '')
              )


# Завершаем подключения 
zapi.user.logout()

Пример №7 Печатаем все triggers которые сработали у группы хостов

from datetime import datetime
from pyzabbix.api import ZabbixAPI

# Переменные
ZABBIXURL = 'http://URL/zabbix/'
ZABBIXAPIUSER = 'USER'
ZABBIXAPIPASSWORD = 'PASSWORD'

# Создаем инстанс zapi
# Будем применять для дальнейших операций 
zapi = ZabbixAPI(url=ZABBIXURL, user=ZABBIXAPIUSER, password=ZABBIXAPIPASSWORD)


#Печатаем список групп
print(f" \nПечатаем список групп:")
groups = zapi.hostgroup.get(output=['itemid','name'])
for group in groups:
        print (group['groupid'],group['name'])

# Получаем триггеры группы узлов с groupids = 2
triggers = zapi.trigger.get(groupids=2, output='extend', expandDescription=1, selectHosts=['host'],)

#print(f"\n Печатаем все триггеры groupids2 {triggers}")

print("\n")

# Печатаем триггеры
for t in triggers:
    print("{0} - {1} - {2}".format(t['hosts'][0]['host'], t['description'], datetime.utcfromtimestamp(int(t['lastchange'])).strftime('%Y-%m-%d %H:%M:%S')))

# Завершаем подключения 
zapi.user.logout()

Пример №8 Печатаем проблемы

###!!!! из доков Для получения проблем, которые были решены ранее, используйте event.get метод.
from datetime import datetime
from pyzabbix.api import ZabbixAPI

# Переменные
ZABBIXURL = 'http://URL/zabbix/'
ZABBIXAPIUSER = 'USER'
ZABBIXAPIPASSWORD = 'PASSWORD'

# Создаем инстанс zapi
# Будем применять для дальнейших операций 
zapi = ZabbixAPI(url=ZABBIXURL, user=ZABBIXAPIUSER, password=ZABBIXAPIPASSWORD)

## Получаем все проблемы по хосту hsrv1_factoria
## !!! На самом деле не все!!! из доков Для получения проблем, которые были решены ранее, используйте event.get метод.
problem = zapi.problem.get(host='hsrv1_factoria', recent='true')

##print("\n", problem)
for pr in problem:
   #print("{0} - {1} - {2} ".format(pr['eventid'], pr['name'], pr['clock']))
   print("{0} - {1} - {2} ".format(pr['eventid'], pr['name'], datetime.utcfromtimestamp(int(pr['clock'])).strftime('%Y-%m-%d %H:%M:%S')))


# Завершаем подключения 
zapi.user.logout()

Пример №9 Печатаем все проблемы (history.get)

from datetime import datetime
from pyzabbix.api import ZabbixAPI

# Переменные
ZABBIXURL = 'http://URL/zabbix/'
ZABBIXAPIUSER = 'USER'
ZABBIXAPIPASSWORD = 'PASSWORD'

# Создаем инстанс zapi
# Будем применять для дальнейших операций 
zapi = ZabbixAPI(url=ZABBIXURL, user=ZABBIXAPIUSER, password=ZABBIXAPIPASSWORD)

#Zabbix ведет время от создания linux
#Для уточнения времени исполняем стандартную команду linux
#date -d @1620925819
#date +%s

# Получаем все проблемы для группы хостов groupids=2 начиная с даты 1620925819 (Чт 13 мая 2021 20:10:19 MSK)
problem = zapi.event.get(groupids=2,time_from=1620925819)
## Может пригодится для уточнения объектов
##print("\n", problem)

for pr in problem:
    print("{0} - {1} - {2} ".format(pr['eventid'], pr['name'], datetime.utcfromtimestamp(int(pr['clock'])).strftime('%Y-%m-%d %H:%M:%S')))


# Завершаем подключения 
zapi.user.logout()

Пример №10 Печатаем все проблемы (history.get) и сохраняем в файл out.csv

from contextlib import redirect_stdout
from datetime import datetime
from pyzabbix.api import ZabbixAPI
# Переменные
ZABBIXURL = 'http://URL/zabbix/'
ZABBIXAPIUSER = 'USER'
ZABBIXAPIPASSWORD = 'PASSWORD'

# Создаем инстанс zapi
# Будем применять для дальнейших операций 
zapi = ZabbixAPI(url=ZABBIXURL, user=ZABBIXAPIUSER, password=ZABBIXAPIPASSWORD)

#Zabbix ведет время от создания linux
#Для уточнения времени исполняем стандартную команду linux
#date -d @1620925819
#date +%s

# Получаем все проблемы для группы хостов groupids=2 начиная с даты 1620925819 (Чт 13 мая 2021 20:10:19 MSK)
problem = zapi.event.get(groupids=2,time_from=1620925819)
## Может пригодится для уточнения объектов
##print("\n", problem)

#Запись CSV файла
with open('out.csv', 'w', encoding='utf_8') as f:
    with redirect_stdout(f):
        for pr in problem:
            print("{0};{1};{2} ".format(pr['eventid'], pr['name'], datetime.utcfromtimestamp(int(pr['clock'])).strftime('%Y-%m-%d %H:%M:%S')))


# Завершаем подключения 
zapi.user.logout()

Пример №11 Создаем узлы (do_request)

from pyzabbix.api import ZabbixAPI

# Переменные
ZABBIXURL = 'http://URL/zabbix/'
ZABBIXAPIUSER = 'USER'
ZABBIXAPIPASSWORD = 'PASSWORD'

# Создаем инстанс zapi
# Будем применять для дальнейших операций 
zapi = ZabbixAPI(url=ZABBIXURL, user=ZABBIXAPIUSER, password=ZABBIXAPIPASSWORD)

#Печатаем все группы узлов
print(f" \nПечатаем список групп:")
groups = zapi.hostgroup.get(output=['itemid','name'])
for group in groups:
        print (group['groupid'],group['name'])



#Список ид teplate и имя teplate
teplates = zapi.template.get(with_items=1)

# для теста вывалить все в teplates
#print(teplates)

for i in teplates:
    print(i['templateid'], i['host'])

# Создаем узел blablalbalba1 c "ip": "8.8.8.9" в группе с id 5 
zapi.do_request(method="host.create",params={
        "host": "blablalbalba1",
        "interfaces": [
            {
                "type": 1,
                "main": 1,
                "useip": 1,
                "ip": "8.8.8.9",
                "dns": "",
                "port": "10050"
            }
        ],
        "groups": [
            {
                "groupid": "5"
            }
        ],
        "templates": [
            {
                "templateid": "10001"
            }
        ],
    }
)

# Проверяем
print(f" \nПолучаем список хостов в группе с id 5")
hosts = zapi.host.get(groupids=5, output=['hostid','name'])
for host in hosts:
        print (host['hostid'],host['name'])



# Завершаем подключения 
zapi.user.logout()

Пример №12 Создаем элемент данных (do_request)

from pyzabbix.api import ZabbixAPI, ZabbixAPIException
import sys

# Переменные
ZABBIXURL = 'http://URL/zabbix/'
ZABBIXAPIUSER = 'USER'
ZABBIXAPIPASSWORD = 'PASSWORD'

# Создаем инстанс zapi
# Будем применять для дальнейших операций 
zapi = ZabbixAPI(url=ZABBIXURL, user=ZABBIXAPIUSER, password=ZABBIXAPIPASSWORD)

#Печатаем все группы узлов
print(f" \nПечатаем список групп:")
groups = zapi.hostgroup.get(output=['itemid','name'])
for group in groups:
        print (group['groupid'],group['name'])

#Получаем список хостов в группе 5
print(f" \nПолучаем список хостов в группе с id 5:")
hosts = zapi.host.get(groupids=5, output=['hostid','name'])
for host in hosts:
        print (host['hostid'],host['name'])



host_name = 'blablalbalba1'

hosts = zapi.host.get(filter={"host": host_name}, selectInterfaces=["interfaceid"])
if hosts:
    host_id = hosts[0]["hostid"]
    print("\nНайден host id {0}".format(host_id))

    try:
        item = zapi.item.create(
            hostid=host_id,
            name='Used disk space on $1 in %',
            key_='vfs.fs.size[/,pused]',
            type=0,
            value_type=3,
            interfaceid=hosts[0]["interfaces"][0]["interfaceid"],
            delay=30
        )

    except ZabbixAPIException as e:
        print(e)
        sys.exit()

    print("Добавили item для itemid {0} на host: {1}".format(item["itemids"][0], host_name))
else:
    print(f"\nХост {host_name} не обнаружен.")



# Завершаем подключения 
zapi.user.logout()

Пример №13 Создаем триггер (do_request)

from pyzabbix.api import ZabbixAPI, ZabbixAPIException
import sys


# Переменные
ZABBIXURL = 'http://URL/zabbix/'
ZABBIXAPIUSER = 'USER'
ZABBIXAPIPASSWORD = 'PASSWORD'

# Создаем инстанс zapi
# Будем применять для дальнейших операций 
zapi = ZabbixAPI(url=ZABBIXURL, user=ZABBIXAPIUSER, password=ZABBIXAPIPASSWORD)



#Печатаем все группы узлов
print(f" \nПечатаем список групп:")
groups = zapi.hostgroup.get(output=['itemid','name'])
for group in groups:
        print (group['groupid'],group['name'])

#Получаем список хостов в группе 5
print(f" \nПолучаем список хостов в группе с id 5:")
hosts = zapi.host.get(groupids=5, output=['hostid','name'])
for host in hosts:
        print (host['hostid'],host['name'])


#Куда и что будем добавлять
host_name = 'blablalbalba1'
trg1="xxx1 {HOST.NAME}"
exp1="last(/blablalbalba1/1111vfs.fs.size[/,pused])=0"
pri1="4"

hosts = zapi.host.get(filter={"host": host_name}, selectInterfaces=["interfaceid"])

if hosts:
    host_id = hosts[0]["hostid"]
    print("\nНайден host id {0}".format(host_id))

    try:
        item = zapi.trigger.create(description=trg1, expression=exp1, priority=pri1)

    except ZabbixAPIException as e:
        print(e)
        sys.exit()

    print("Добавили trigger для {0}".format(host_name))
else:
    print(f"\nХост {host_name} не обнаружен.")


# Завершаем подключения 
zapi.user.logout()