Raccogliere dati da Zabbix agent
Panoramica
zabbix_utils consente di raccogliere dati da Zabbix agent (in modo simile a Zabbix get).
I dati possono essere raccolti in modalità sincrona o asincrona:
- In modalità sincrona, lo script Python richiede i dati e attende di riceverli prima di continuare, il che è adatto a operazioni semplici, sequenziali e prevedibili.
- In modalità asincrona, lo script richiede i dati senza attendere ogni risposta, consentendo ad altre operazioni di procedere in parallelo; questo è più efficiente per richieste lente o grandi quantità di dati.
Gli esempi in questa pagina si concentrano sulla modalità sincrona, sebbene la modalità asincrona segua schemi simili. Ulteriori esempi sono disponibili nel repository GitHub zabbix_utils.
Importazione
Per utilizzare zabbix_utils per raccogliere i valori degli item, importa la classe Getter nel tuo script Python:
from zabbix_utils import Getter
Dati della richiesta
Per richiedere il valore di un item:
- Creare un'istanza di
Getter, specificando l'indirizzo IP e la porta del proprio agent Zabbix. - Chiamare il metodo
get()sull'istanzaGetter, specificando la chiave dell'item che si desidera recuperare.
Ad esempio, per richiedere i dati dell'item system.uname:
agent = Getter(host='192.0.2.0', port=10050)
response = agent.get('system.uname')
Utilizzo di un IP non predefinito
Se il server che esegue lo script dispone di più indirizzi IP, è possibile specificare un source_ip che il Getter utilizzerà durante la connessione a Zabbix agent:
agent = Getter(
host='192.0.2.0',
port=10050,
source_ip='10.10.7.1'
)
Utilizzo del timeout
Puoi impostare un timeout di risposta per Getter per controllare per quanto tempo il tuo script deve attendere una risposta da Zabbix agent prima di rinunciare:
agent = Getter(
host='192.0.2.0',
port=10050,
timeout=30
)
Utilizzo della crittografia
Getter non include il supporto integrato per la crittografia, ma è possibile fornirlo creando un wrapper tramite librerie di terze parti:
def psk_wrapper(sock, tls):
# ...
# Implementazione del wrapper TLS PSK per il socket
# ...
agent = Getter(
host='192.0.2.0',
port=10050,
socket_wrapper=psk_wrapper
)
Risposta
La risposta di Zabbix agent viene elaborata dalla libreria e restituita come oggetto AgentResponse:
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
Modalità asincrona
La modalità asincrona consente al tuo script di raccogliere valori senza attendere che ciascuno arrivi. Questo può rendere il tuo script più efficiente quando deve raccogliere molti valori o quando alcuni valori richiedono molto tempo per essere raccolti.
Quando si utilizza la modalità asincrona, ci sono differenze importanti rispetto alla modalità sincrona:
- Importa il modulo
asynciodi Python (devi prima installare le dipendenze richieste). - Importa
AsyncGetterinvece diGetter. - Scrivi il tuo codice all'interno di una funzione
async. - Usa
awaitquando chiami il metodoget().
Ad esempio, per raccogliere un singolo valore utilizzando la modalità asincrona:
# 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())