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:
- Erstellen Sie eine
Getter-Instanz und geben Sie 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.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
AsyncGetteranstelle vonGetter. - Schreiben Sie Ihren Code innerhalb einer
async-Funktion. - Verwenden Sie
await, wenn Sie die Methodeget()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())