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:
- Erstellen Sie eine
Getter-Instanz und geben Sie dabei die IP-Adresse und den Port Ihres Zabbix Agent an. - Rufen Sie die Methode
get()für dieGetter-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
AsyncGetteranstelle vonGetter. - Schreiben Sie Ihren Code innerhalb einer
async-Funktion. - Verwenden Sie
await, wenn Sie die Methodeget()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())