Search code examples
pythonzabbixzabbix-api

String to call specific data from a host Inventory


Looking for some guidance on how to get this code to point to the correct inventory within the Zabbix API.

Currently it is pulling all data from Inventory > Hosts > Latest Data.

Basically i'm trying to get this to change, to request the data grab to go to Inventory > Hosts > > Details and then grab the following 'Location latitude' and 'Location longitude'

My first assumption was the application within the def() getInventory was the culprit to change but it seems that even when I change that my output is the same.

If you need any further information please let me know.

import sys
import datetime
import csv
import re
import requests
import tkinter as tk
from tkinter import filedialog
from pyzabbix import ZabbixAPI,ZabbixAPIException


def initializeapi():
    tries = 4
    while tries >= 0:
        user = "XXX"
        password = "XXX"
        if isinstance(user, str) == True and isinstance(password, str) == True:
            try:
                z.login(user=user,password=password)
                print("Logged into ZabbixAPI version " + z.api_version() + ".")
                return True
            except ZabbixAPIException as e:
                print(e)
                tries -= 1
            except requests.Timeout as f:
                print(f, "\nProgram will now exit.")
                sys.exit(2)
        else:
            print("Username and password must be strings.")
    else:
        print("Too many failed login attempts.")
        return False


def getinventory(listname, hostid='',):
    if isinstance(listname, list):
        if len(hostid) != 0:
            for i in z.item.get(output='extend', hostids=hostid, application='Monitoring'):
                 j = [i['hostid'], i['itemid'], i['name'], i['lastvalue'], i['units'], i['description'], i["location_lon"]]
                 listname.append(j)
        else:
            for i in z.item.get(output='extend', application='Monitoring'):
                 j = [i['hostid'], i['itemid'], i['name'], i['lastvalue'], i['units'], i['description']]
                 listname.append(j)
    else:
        print("Must pass list variable.")
        return False
    return True


def validateserver(serverip):
    if re.search('http://', serverip):
        return True
    elif re.search('https://', serverip):
        return True
    else:
        return False


def gethostdict(dictname):
    if isinstance(dictname, dict):
        for h in z.host.get(output="extend"):
            dictname[h['hostid']] = h['name']
    else:
        print("Must pass dict variable.")
        return False
    return True

def hostchange(listname, dictname):
    for index, item in enumerate(listname):
        if isinstance(item, list):
            hostchange(item, dictname)
        elif item in dictname.keys():
            listname[index] = dictname[item]
    return


def writecsv(writelist):
    with open(getfilepath(), 'w', newline='', encoding="utf-8") as result:
        writer = csv.writer(result, dialect='excel')
        header = ['Host', 'Item ID', 'Name', 'Value', 'Units', 'Description',]
        writer.writerow(header)
        writer.writerows(writelist)


def getfilepath():
    root = tk.Tk()
    return filedialog.asksaveasfilename(initialdir=r'XXX', defaultextension='.csv',
                                             initialfile='Inventory ' + str(datetime.date.today()),
                                             filetypes=(("Comma Separated Values",'*.csv'),("All Files", '*.*')))


if __name__ == '__main__':
    retries = 4
    while retries >= 0:
        serverip = "XXX"
        if validateserver(serverip):
            timeout = 3.5
            try:
                z = ZabbixAPI(str(serverip), timeout=timeout)
            except ZabbixAPIException as e:
                print(e)
            if initializeapi():
                break
        elif retries > 0:
            retries -= 1
        else:
            print("Too many failed attempts.")
            sys.exit(2)
    list1 = []
    dict1 = {}
    getinventory(list1)
    gethostdict(dict1)
    hostchange(list1, dict1)
    writecsv(list1)
    print("Complete.")

Solution

  • Refer this Documentation.. https://www.zabbix.com/documentation/current/en/manual/api/reference/host/object#host-inventory.. below simple python script works for me

    #using token
    import requests
    import json
    # replace <your zabbix server ip> in url
    url = 'http://<your zabbix server ip>/api_jsonrpc.php' 
    #replace <your zabbix auth token> in payload
    payload = '{"jsonrpc": "2.0", "method": "host.get", "params": {"output": ["hostid","host","name","status"],"selectInventory": ["os_full","tag","location","location_lat","location_lon"]}, "auth": "<your zabbix auth token>", "id": 1 }'
    headers = {'content-type': 'application/json-rpc'}
    r = requests.post(url, data=payload, headers=headers)
    hostslist = r.json()['result']
    print(hostlist)
    

    Here is the Python Script using username and password

    from pyzabbix import ZabbixAPI
    
    ZABBIX_SERVER = 'http://<your zabbix server>'
    with ZabbixAPI(ZABBIX_SERVER) as zapi:
        zapi.login('<username>', '<password>')
        hosts = zapi.host.get(output=['hostid','itemid','name','lastvalue','units','desciption'], selectInventory=['location','location_lat','location_lon'])
        for host in hosts:
            print(host)