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

Um einen Datenpunktwert anzufordern:

  1. Erstellen Sie eine Getter-Instanz und geben Sie 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.1', port=10050)
response = agent.get('system.uname')
Verwendung einer nicht standardmäßigen IP

Wenn der Server, auf dem Ihr Skript ausgeführt wird, mehrere IP-Adressen hat, können Sie für den Getter eine source_ip angeben, die beim Verbinden mit dem Zabbix Agent verwendet werden soll:

agent = Getter(
    host='192.0.2.1',
    port=10050,
    source_ip='10.10.7.1'
)
Verwenden von Timeout

Sie können für den Getter ein 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.1',
    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 bereitstellen, indem Sie mithilfe von Bibliotheken von Drittanbietern einen Wrapper erstellen:

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

agent = Getter(
    host='192.0.2.1',
    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 warten zu müssen. Dadurch kann Ihr Skript effizienter arbeiten, wenn es viele Werte erfassen muss oder wenn die Erfassung mancher Werte lange dauert.

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

  • Importieren Sie das Python-Modul asyncio (Sie müssen zuvor 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 einen einzelnen Wert im asynchronen Modus 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.1', 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())