Python 3.6 a Zabbix API: vytvoření listu s lastdat

noger

Python 3.6 a Zabbix API: vytvoření listu s lastdat
« kdy: 18. 03. 2020, 09:50:56 »
Ahojte,
potreboval by som poradit s nasledujucou mojou viziou:
Mam skript report1.py

Kód: [Vybrat]
#!/usr/bin/env python3.6
#Import libraries
from pyzabbix import ZabbixAPI
import math

#Basic configuration
zapi = ZabbixAPI("https://ulr.zabbix.api.tld")
zapi.login("test123", "test123")

###Definition custom functions
#Human readable unit's
def convert_size(size_bytes):
    if size_bytes == 0:
        return "0B"
    size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
    i = int(math.floor(math.log(size_bytes, 1024)))
    power = math.pow(1024, i)
    size = round(size_bytes / power, 2)
    return "{} {}".format(size, size_name[i])

############################################
#Query:
for hlist in zapi.host.get(output="extend"):
    for itd in zapi.item.get(output="extend",hostids=(hlist['hostid']),searchWildcardsEnabled="true",search={"name":"*Total disk space*" }):
        for itdval in zapi.history.get(output="extend",hostids=(hlist['hostid']),itemids=(itd['itemid']),limit="1"):
            var_disk_size = int(itdval['value'])
        print(hlist['hostid'],hlist['host'],hlist['name'],itd['name'],(convert_size(var_disk_size)),sep=";")

jeho vystupom je nieco taketo:
10084;zabbix2.domain.sk;zabbix2.domain.sk;Total disk space on /;26.79 GB
10084;zabbix2.domain.sk;zabbix2.domain.sk;Total disk space on /boot;1014.0 MB
10283;mailgw2.domain.sk;ems02.domain.sk;Total disk space on /;45.59 GB
10283;mailgw2.domain.sk;ems02.domain.sk;Total disk space on /boot;496.67 MB
10284;mailgw.domain.sk;ems01.domain.sk;Total disk space on /;45.59 GB
10284;mailgw.domain.sk;ems01.domain.sk;Total disk space on /boot;496.67 MB


Ako spravne dosiahnut ciel, ked ciel je vystup ktory by mal byt takyto:

10084;zabbix2.domain.sk;zabbix2.domain.sk;Total disk space on /;26.79 GB;Total disk space on /boot;1014.0 MB
10283;mailgw2.domain.sk;ems02.domain.sk;Total disk space on /;45.59 GB,Total disk space on /boot;496.67 MB
10284;mailgw.domain.sk;ems01.domain.sk;Total disk space on /;45.59 GB;Total disk space on /boot;496.67 MB


Zasekol som sa pri citani dokumentacie k n-ticiam, dictionaries, lists atd... v pythone. Asi by som potreboval mierne nakopnut.
P.S. niesom programator, iba obycajny admin. Ospravedlnujem sa ze vam kafrem do prace, ale rad sa naucim nieco nove.
« Poslední změna: 18. 03. 2020, 10:14:28 od Petr Krčmář »


Re:Python 3.6 a Zabbix API: vytvoření listu s lastdat
« Odpověď #1 kdy: 18. 03. 2020, 10:26:06 »
Ahojte,
potreboval by som poradit s nasledujucou mojou viziou:
Mam skript report1.py

Kód: [Vybrat]
#!/usr/bin/env python3.6
#Import libraries
from pyzabbix import ZabbixAPI
import math

#Basic configuration
zapi = ZabbixAPI("https://ulr.zabbix.api.tld")
zapi.login("test123", "test123")

###Definition custom functions
#Human readable unit's
def convert_size(size_bytes):
    if size_bytes == 0:
        return "0B"
    size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
    i = int(math.floor(math.log(size_bytes, 1024)))
    power = math.pow(1024, i)
    size = round(size_bytes / power, 2)
    return "{} {}".format(size, size_name[i])

############################################
#Query:
for hlist in zapi.host.get(output="extend"):
    for itd in zapi.item.get(output="extend",hostids=(hlist['hostid']),searchWildcardsEnabled="true",search={"name":"*Total disk space*" }):
        for itdval in zapi.history.get(output="extend",hostids=(hlist['hostid']),itemids=(itd['itemid']),limit="1"):
            var_disk_size = int(itdval['value'])
        print(hlist['hostid'],hlist['host'],hlist['name'],itd['name'],(convert_size(var_disk_size)),sep=";")

jeho vystupom je nieco taketo:
10084;zabbix2.domain.sk;zabbix2.domain.sk;Total disk space on /;26.79 GB
10084;zabbix2.domain.sk;zabbix2.domain.sk;Total disk space on /boot;1014.0 MB
10283;mailgw2.domain.sk;ems02.domain.sk;Total disk space on /;45.59 GB
10283;mailgw2.domain.sk;ems02.domain.sk;Total disk space on /boot;496.67 MB
10284;mailgw.domain.sk;ems01.domain.sk;Total disk space on /;45.59 GB
10284;mailgw.domain.sk;ems01.domain.sk;Total disk space on /boot;496.67 MB


Ako spravne dosiahnut ciel, ked ciel je vystup ktory by mal byt takyto:

10084;zabbix2.domain.sk;zabbix2.domain.sk;Total disk space on /;26.79 GB;Total disk space on /boot;1014.0 MB
10283;mailgw2.domain.sk;ems02.domain.sk;Total disk space on /;45.59 GB,Total disk space on /boot;496.67 MB
10284;mailgw.domain.sk;ems01.domain.sk;Total disk space on /;45.59 GB;Total disk space on /boot;496.67 MB


Zasekol som sa pri citani dokumentacie k n-ticiam, dictionaries, lists atd... v pythone. Asi by som potreboval mierne nakopnut.
P.S. niesom programator, iba obycajny admin. Ospravedlnujem sa ze vam kafrem do prace, ale rad sa naucim nieco nove.

Ten print mas v ramci druheho for cyklu s itemama

Posun indentaci at se spousti v ramci prvniho for, v ramci druheho fro cyklu si postupne nastrkej do pole pary item name + item value, pak to cele vyjed printem.

Akorat nechapu ucel tohtoto snazeni, vysledkem bude obtizne parsovatelny zprasek, protoze pocet LDD discoverovanych partitions je dynamicky. originalni format je na tom lip, JSON by byl nejlip

noger

Re:Python 3.6 a Zabbix API: vytvoření listu s lastdat
« Odpověď #2 kdy: 18. 03. 2020, 16:35:52 »
@ Standa Blábol : Vdaka za pomoc a komentar. Niekedy jednoducho pomoze jedna/dve vety a hned sa cloveku lahsie rozmysla.

Teraz to vyzera ovela lepsie a este som tam pridal aj kolko ma server RAM:
Kód: [Vybrat]
dict = {}
for hlist in zapi.host.get(output="extend"):
        dict = (hlist)
#       print(dict)
        for itd in zapi.item.get(output="extend",hostids=(hlist['hostid']),searchWildcardsEnabled="true",search={"name":"*Total disk space*" }):
                for itdval in zapi.history.get(output="extend",hostids=(hlist['hostid']),itemids=(itd['itemid']),limit="1"):
                        var_disk_size = int(itdval['value'])
                        dict[itd['name']] = var_disk_size

        for itm in zapi.item.get(output="extend",hostids=(hlist['hostid']),searchWildcardsEnabled="true",search={"name":"*Total memory*" }):
                for mmval in zapi.history.get(output="extend",hostids=(hlist['hostid']),itemids=(itm['itemid']),limit="1"):
                        var_memory_size = int(mmval['value'])
                        dict[itm['name']] = var_memory_size

        print(dict)

Vystup je krasny. Da sa s nim lepsie pracovat ako si spominal:

{'hostid': '10414', 'proxy_hostid': '10411', 'host': 'server1.domain.sk', 'status': '0', 'disable_until': '0', 'error': '', 'available': '0', 'errors_from': '0', 'lastaccess': '0', 'ipmi_authtype': '-1', 'ipmi_privilege': '2', 'ipmi_username': '', 'ipmi_password': '', 'ipmi_disable_until': '0', 'ipmi_available': '0', 'snmp_disable_until': '0', 'snmp_available': '0', 'maintenanceid': '0', 'maintenance_status': '0', 'maintenance_type': '0', 'maintenance_from': '0', 'ipmi_errors_from': '0', 'snmp_errors_from': '0', 'ipmi_error': '', 'snmp_error': '', 'jmx_disable_until': '0', 'jmx_available': '0', 'jmx_errors_from': '0', 'jmx_error': '', 'name': 'server1.domain.sk', 'flags': '0', 'templateid': '0', 'description': '', 'tls_connect': '1', 'tls_accept': '1', 'tls_issuer': '', 'tls_subject': '', 'tls_psk_identity': '', 'tls_psk': '', 'proxy_address': '', 'auto_compress': '1', 'Total disk space on C:': 598903615488, 'Total disk space on D:': 2399258275840, 'Total disk space on H:': 1000169533440, 'Total memory': 33790238720}
{'hostid': '10415', 'proxy_hostid': '10411', 'host': 'zabbix.domain.sk', 'status': '0', 'disable_until': '0', 'error': '', 'available': '1', 'errors_from': '0', 'lastaccess': '0', 'ipmi_authtype': '-1', 'ipmi_privilege': '2', 'ipmi_username': '', 'ipmi_password': '', 'ipmi_disable_until': '0', 'ipmi_available': '0', 'snmp_disable_until': '0', 'snmp_available': '0', 'maintenanceid': '0', 'maintenance_status': '0', 'maintenance_type': '0', 'maintenance_from': '0', 'ipmi_errors_from': '0', 'snmp_errors_from': '0', 'ipmi_error': '', 'snmp_error': '', 'jmx_disable_until': '0', 'jmx_available': '0', 'jmx_errors_from': '0', 'jmx_error': '', 'name': 'zabbix.domain.sk', 'flags': '0', 'templateid': '0', 'description': 'Test1', 'tls_connect': '1', 'tls_accept': '1', 'tls_issuer': '', 'tls_subject': '', 'tls_psk_identity': '', 'tls_psk': '', 'proxy_address': '', 'auto_compress': '1', 'Total disk space on /': 59743842304, 'Total disk space on /boot': 1023303680, 'Total disk space on /home': 56272654336, 'Total memory': 8033837056}

noger

Re:Python 3.6 a Zabbix API: vytvoření listu s lastdat
« Odpověď #3 kdy: 27. 03. 2020, 19:34:03 »
Este mam predsa len jeden dotaz:

mam nasledovny skript:

Kód: [Vybrat]
#Human readable format of partition's and memory size
def convert_size(size_bytes):
    if size_bytes == 0:
        return "0B"
    size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
    i = int(math.floor(math.log(size_bytes, 1024)))
    power = math.pow(1024, i)
    size = round(size_bytes / power, 2)
    return "{} {}".format(size, size_name[i])

#Collect all values of available partitions:
def disk_sizes():
        for itd in zapi.item.get(output="extend",hostids=(hlist['hostid']),searchWildcardsEnabled="true",search={"name":"*Total disk space*" }):
                for itdval in zapi.history.get(output="extend",hostids=(hlist['hostid']),itemids=(itd['itemid']),limit="1"):
                        var_disk_size = int(itdval['value'])
                        dict[itd['name']] = (convert_size(var_disk_size))
#Collect RAM size:
def ram_size():
        for itm in zapi.item.get(output="extend",hostids=(hlist['hostid']),searchWildcardsEnabled="true",search={"name":"*Total memory*" }):
                for mmval in zapi.history.get(output="extend",hostids=(hlist['hostid']),itemids=(itm['itemid']),limit="1"):
                        var_memory_size = int(mmval['value'])
                        dict[itm['name']] = (convert_size(var_memory_size))
#Query:
for hlist in zapi.host.get(output=["hostid","name","host"],limit="15"):
        dict = (hlist)
        disk_sizes()
        ram_size()
        data_json = json.dumps(dict, indent = 4, sort_keys = True)
        print(data_json)

Ktoreho vystup je

{
    "Total disk space on /": "45.59 GB",
    "Total disk space on /boot": "496.67 MB",
    "Total memory": "3.7 GB",
    "host": "mailgw.domain.sk",
    "hostid": "10284",
    "name": "ems01.domain.sk"
}
{
    "Total disk space on /": "75.44 GB",
    "Total disk space on /boot": "496.67 MB",
    "Total memory": "3.7 GB",
    "host": "zbx-prx1.domain.sk",
    "hostid": "10285",
    "name": "zbx-prx1.domain.sk"
}
{
    "host": "Commet.web.sensor.1",
    "hostid": "10286",
    "name": "ServerRoom sensor EIN1"
}
{
    "host": "firewall01",
    "hostid": "10287",
    "name": "prvy-firewall - Cisco ASA"
}


Ako dosiahnut, aby vystupom bolo nieco takeho:


{
    "Basic Info": {
        "host": "zbx-prx1.domain.sk",
        "hostid": "10285",
        "name": "zbx-prx1.domain.sk"
    },
    "Technical info": {
        "Total disk space on /": "75.44 GB",
        "Total disk space on /boot": "496.67 MB",
        "Total memory": "3.7 GB"
    }
}
{
    "Basic Info": {
        "host": "firewall01",
        "hostid": "10287",
        "name": "prvy-firewall - Cisco ASA"
    },
    "Technical info": {
    }
}


Ciel som si dal sam, myselel som si ze to hravo zvladnem, ale dnes cely den, som nad tym sedel a nepodarilo sa mi dosiahnut zelaneho stavu. Bud mi to zhavaruje na tom, ze niektore hosty nemaju napriklad niektory key ked sa to pokusam spravit cestou:

Kód: [Vybrat]
        final_dict = {'Basic Info': {'HostID':(dict['hostid']),'Name':(dict['host']),'Visible Name':(dict['name'])},'Technical info':{'Total memory RAM':(dict['Total memory'])}}
        data_json = json.dumps(dict, indent = 4, sort_keys = True)

S najvacsou pravdepodobnostou som nespravne pochopil ako funguju dict a ako z nich spravit json v uvedenom pripade.
« Poslední změna: 27. 03. 2020, 19:40:43 od noger »

Ink

  • *****
  • 670
    • Zobrazit profil
    • E-mail
Re:Python 3.6 a Zabbix API: vytvoření listu s lastdat
« Odpověď #4 kdy: 27. 03. 2020, 20:42:59 »
Zkus treba neco takoveho:

Kód: [Vybrat]
import pprint

D1 = {
    "Total disk space on /": "45.59 GB",
    "Total disk space on /boot": "496.67 MB",
    "Total memory": "3.7 GB",
    "host": "mailgw.domain.sk",
    "hostid": "10284",
    "name": "ems01.domain.sk"
}
D2 = {
    "Total disk space on /": "75.44 GB",
    "Total disk space on /boot": "496.67 MB",
    "Total memory": "3.7 GB",
    "host": "zbx-prx1.domain.sk",
    "hostid": "10285",
    "name": "zbx-prx1.domain.sk"
}
D3 = {
    "host": "Commet.web.sensor.1",
    "hostid": "10286",
    "name": "ServerRoom sensor EIN1"
}
D4 = {
    "host": "firewall01",
    "hostid": "10287",
    "name": "prvy-firewall - Cisco ASA"
}

BASIC_KEYS = {
    "host",
    "hostid",
    "name",

}

def print_dict(d):
    pprint.pprint({
        "Basic info" : {
            k: d[k] for k in d if k in BASIC_KEYS
        },
        "Technical info" : {
            k: d[k] for k in d if k not in BASIC_KEYS
        },
    })

print_dict(D1)
print_dict(D2)
print_dict(D3)
print_dict(D4)


qelurg

  • ****
  • 382
    • Zobrazit profil
    • E-mail
Re:Python 3.6 a Zabbix API: vytvoření listu s lastdat
« Odpověď #5 kdy: 27. 03. 2020, 20:54:49 »
Chceš udělat něco jako tohle:
Kód: [Vybrat]
final     = list()
container = dict()
basic     = dict()
tech      = dict()

container['Basic info']     = basic
container['Technical info'] = tech

final.append(container)

noger

Re:Python 3.6 a Zabbix API: vytvoření listu s lastdat
« Odpověď #6 kdy: 30. 03. 2020, 10:00:49 »
Chceš udělat něco jako tohle:
Kód: [Vybrat]
final     = list()
container = dict()
basic     = dict()
tech      = dict()

container['Basic info']     = basic
container['Technical info'] = tech

final.append(container)

Premakane, vdaka.  ;)