blog_hero_zabbix_utils met Python3

zabbix_utils met Python3

Oct 05 2024

De zabbix_utils library

In sommige gevallen hebben we niet meteen de mogelijkheid om data of configuratie door te sturen naar Zabbix of willen we iets geautomatiseerder gebruiken. Zabbix heeft hiervoor een heel goed gedocumenteerde API maar dat is niet altijd even gebruiksvriendelijk.

Gelukkig heeft Zabbix hiervoor de perfecte oplossing; Een Python library. Python is een eenvoudig te leren scripttaal die wereldwijd breed gebruikt wordt door tal van gebruikers. Als jij er nog geen gebruik van maakt, zal je dat na deze post zeker wel doen!

Wat je verder moet weten over de zabbix_utils is dat deze library gebruikt maakt van alles wat Zabbix te bieden heeft. Iedere beschikbare API call kan met deze tools gemaakt worden. Dat varieert dus van configuratie wijzigingen doorvoeren, tot wijzigingen aan jouw Zabbix installatie zelf tot zelfs verzamelde gegevens uitlezen. Van zodra je een beetje vertrouwd bent met deze library, kan je er van zelf mee aan de slag. Voor die verdere stappen verwijs ik je graag door naar de documentatie. Voor nu zullen we al even naar een eenvoudig voorbeeld kijken.

Eerst een paar zaken op orde stellen

Je moet natuurlijk een paar dingen eerst installeren. Ik ga er opnieuw van uit dat je een RHEL gebasseerd OS gebruikt. Anders gaat iedere zoekmachine je wel kunnen helpen. Hier lopen we er even door:

  • Python3: dnf install python3
  • Pip: dnf install python3-pip
  • zabbix_utils: pip3 install zabbix_utils
  • Wonderwords: (optioneel voor de Utils maar nodig voor het script hieronder): pip3 install wonderwords

Python is een heel populaire programmeer / scripttaal. Het is ook heel eenvoudig te lezen en snel te leren. Hierbij moet je vooral rekening houden dat je voldoende spaties of tabs gebruikt om aan te geven dat je nog in een functie of loop aan het werken bent.

Een simpel script

Nu we alles hebben, kunnen we ermee aan de slag. We beginnen met de basis van een script. Maak dus een leeg document aan en volg gerust mee.

#!/usr/bin/python3

# Importeer utils en wonderwords
from zabbix_utils import ZabbixAPI
from wonderwords import RandomWord

# Variabelen
zabbix_url="https://link.to.zabbix/api_jsonrpc.php"
api_token="<token>"
rw = RandomWord()

# Login
api = ZabbixAPI(url=api_token)
api.login(token=api_token)

We starten hier dus met een Python script. Vervolgens importeren we de nodige bibliotheken. Onder variabelen hebben we daar dan met zabbix_url een pad naar onze Zabbix instantie met daarachter api_jsonrpc.php wat de endpoint voor de API is.

De Token kan aangemaakt worden in Zabbix onder User settings door links onderaan de pagina vervolgens op API tokens te klikken. In het nieuwe venster kan je nu een token aanmaken. Zorg voor een duidelijke omschrijving en eventueel een vervaldatum. Zorg dat je daarna de token goed kopieert en opslaat. Je kan wel een nieuwe token genereren maar dezelfde string ga je niet meer te zien krijgen.

Op gebied van rechten zorgt de token voor dezelfde rechten als de user voor wie de token is aangemaakt. Als die user iets niet kan, kan de API daar geen verandering brengen.

Voor het laatste stukje van het eerste deel gaan we de effectieve login doen. We zetten een verbinding op naar zabbix_url en melden dan aan met de token.

# Maak een host aan
def create_host(host_name):
    result = api.host.create({
        "host": host_name,
        "interfaces": [{
            "type": 1,
            "main": 1,
            "useip": 0,
            "ip": "",
            "dns": f"<DNS NAAM>",
            "port": "10050"
        }],
        "tags": [{
            "tag": "purpose",
            "value": "dummy"
        }],
        "tls_accept": 2,
        "tls_connect": 2,
        "tls_psk": "<PSK>",
        "tls_psk_identity": "PSKIdentity",
        "monitored_by": 2,
        "proxy_groupid": "1",
        "groups": [{
            "groupid": "26"
        }],
        "templates": [{
            "templateid": "10561"
        }]
    })
    return result

In dit script maken we een host aan met naam host_name. We definieƫren een Zabbix interface aan die op DNS zal verbinden op poort 10050. We kunnen daaronder tags terugvinden. Hier is er slechts eentje maar dat kunnen er veel meer zijn. Daarna stellen we ook een preshared key in. Dit zorgt ervoor dat we meteen kunnen genieten van een beveiligde verbinding.

Het volgende stuk geven we aan dat de host door een Proxy group wordt beheerd en we geven ook mee welke group dat is. Tot slot geven we ook aan tot welke groep het toestel behoort en welke templates dat gelinkt mogen worden. Hier gebruik ik een zelf aangemaakte group maar de templateid kan je gerust gebruiken.

Als je wilt weten welke groupid of templateid je moet gebruiken, kan je naar die entiteit gaan en kan je in de URL meestal die code terugvinden.

# Genereer 20 nieuwe hosts met een unieke naam
for _ in range(20):
    word1=rw.word()
    word2=rw.word()
    host_name = f"{word1.capitalize()} {word2.capitalize()}"
    result = create_host(host_name)
    print(f"Created host: {host_name} - Result: {result}")

Om het script nu bruikbaar te maken, gaan we hier een kleine loop maken die 20 keer twee willekeurige woorden gaat genereren om daar dan een host van te maken. Het resultaat krijgen we daarna ook gewoon terug.

Dat was het al! Nu hebben we een volledig werkend script. Dit kan je uitvoeren met python3 <naam van je script> en verder is het nu gewoon doen! Veel succes en happy monitoring!