Daten vom Zabbix Agent erfassen

Überblick

zabbix_utils ermöglicht es Ihnen, Daten vom Zabbix Agent zu erfassen (ähnlich wie bei Zabbix get).

Daten können im synchronen oder asynchronen Modus erfasst werden:

  • Im synchronen Modus fordert Ihr Python-Skript Daten an und wartet vor dem Fortfahren auf die Antwort, was sich für einfache, sequenzielle und vorhersehbare Vorgänge eignet.
  • Im asynchronen Modus fordert das Skript Daten an, ohne auf jede einzelne Antwort zu warten, sodass andere Vorgänge parallel fortgesetzt werden können; dies ist bei langsamen Anfragen oder großen Datenmengen effizienter.

Die Beispiele auf dieser Seite konzentrieren sich auf den synchronen Modus, obwohl der asynchrone Modus ähnlichen Mustern folgt. Zusätzliche Beispiele sind im GitHub-Repository zabbix_utils verfügbar.

Import

Um zabbix_utils zum Sammeln von Datenpunkt-Werten zu verwenden, importieren Sie die Klasse Getter in Ihr Python-Skript:

from zabbix_utils import Getter

Anfragedaten

So fordern Sie einen Datenpunktwert an:

  1. Erstellen Sie eine Getter-Instanz und geben Sie dabei die IP-Adresse und den Port Ihres Zabbix Agent an.
  2. Rufen Sie die Methode get() für die Getter-Instanz auf und geben Sie den Schlüssel des Datenpunkts an, den Sie abrufen möchten.

Um beispielsweise Daten für den Datenpunkt system.uname anzufordern:

agent = Getter(host='192.0.2.0', port=10050)
response = agent.get('system.uname')
Verwenden einer nicht standardmäßigen IP

Wenn der Server, auf dem Ihr Skript ausgeführt wird, mehrere IP-Adressen hat, können Sie eine source_ip angeben, die der Getter beim Herstellen der Verbindung zum Zabbix Agent verwenden soll:

agent = Getter(
    host='192.0.2.0',
    port=10050,
    source_ip='10.10.7.1'
)
Timeout verwenden

Sie können für den Getter einen Antwort-timeout festlegen, um zu steuern, wie lange Ihr Skript auf eine Antwort vom Zabbix Agent warten soll, bevor es aufgibt:

agent = Getter(
    host='192.0.2.0',
    port=10050,
    timeout=30
)
Verwendung von Verschlüsselung

Der Getter enthält keine integrierte Unterstützung für Verschlüsselung, aber Sie können diese durch die Erstellung eines Wrappers mit Bibliotheken von Drittanbietern bereitstellen:

def psk_wrapper(sock, tls):
    # ...
    # Implementierung eines TLS-PSK-Wrappers für den Socket
    # ...

agent = Getter(
    host='192.0.2.0',
    port=10050,
    socket_wrapper=psk_wrapper
)
Antwort

Die Antwort des Zabbix Agent wird von der Bibliothek verarbeitet und als AgentResponse-Objekt zurückgegeben:

print(response)
# {
#     "error": null,
#     "raw": "Linux zabbix_server 5.15.0-3.60.5.1.el9uek.x86_64",
#     "value": "Linux zabbix_server 5.15.0-3.60.5.1.el9uek.x86_64"
# }

print(response.value)
# Linux zabbix_server 5.15.0-3.60.5.1.el9uek.x86_64

print(response.error)
# None
Asynchroner Modus

Der asynchrone Modus ermöglicht es Ihrem Skript, Werte zu erfassen, ohne auf das Eintreffen jedes einzelnen Werts zu warten. Dadurch kann Ihr Skript effizienter werden, wenn es viele Werte erfassen muss oder wenn die Erfassung einiger Werte lange dauert.

Bei der Verwendung des asynchronen Modus gibt es im Vergleich zum synchronen Modus wichtige Unterschiede:

  • Importieren Sie das Python-Modul asyncio (Sie müssen zunächst die erforderlichen Abhängigkeiten installieren).
  • Importieren Sie AsyncGetter anstelle von Getter.
  • Schreiben Sie Ihren Code innerhalb einer async-Funktion.
  • Verwenden Sie await, wenn Sie die Methode get() aufrufen.

Zum Beispiel, um mit dem asynchronen Modus einen einzelnen Wert zu erfassen:

# 1. Import asyncio for asynchronous mode, and AsyncGetter from zabbix_utils:
import asyncio
from zabbix_utils import AsyncGetter

# 2. Define the main async function where all data requests will be executed:
async def main():
    agent = AsyncGetter(host='192.0.2.0', port=10050)

    # 3. Fetch the system.uname value from Zabbix agent (must await):
    response = await agent.get('system.uname')

    # 4. Print the value returned by Zabbix agent:
    print(response.value)

# 5. Run the async main() function using asyncio's event loop:
asyncio.run(main())