---
title:  "zabbix_utils met Python3"
excerpt: "Eenvoudig gebruik maken van de Zabbix API"
date:   "2024-10-05T21:00:00.000Z"
author: Eli Winderickx
hero_image: /ZabbixUtils_Cover.png
category: Zabbix,Python,Scripting
---
# 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](https://www.zabbix.com/documentation/current/en/manual/api). 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.

```python
#!/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.

```python
# 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.

```python
# 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!
