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
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.1', port=10050)
response = agent.get('system.uname')
Utilizzo di un IP non predefinito
Se il server su cui viene eseguito lo script ha più indirizzi IP, puoi specificare un source_ip da usare per Getter quando si connette all'agent Zabbix:
agent = Getter(
host='192.0.2.1',
port=10050,
source_ip='10.10.7.1'
)
Uso del timeout
Puoi impostare un timeout di risposta per il Getter per controllare per quanto tempo il tuo script deve attendere una risposta dall'agent Zabbix prima di rinunciare:
agent = Getter(
host='192.0.2.1',
port=10050,
timeout=30
)
Uso della crittografia
Getter non include il supporto integrato per la crittografia, ma è possibile aggiungerlo 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.1',
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 allo script di raccogliere valori senza attendere l'arrivo di ciascuno di essi. Questo può rendere lo script più efficiente quando deve raccogliere molti valori o quando alcuni valori richiedono molto tempo per essere raccolti.
Quando si usa 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 codice all'interno di una funzione
async. - Usa
awaitquando chiami il metodoget().
Ad esempio, per raccogliere un singolo valore usando la modalità asincrona:
# 1. Importa asyncio per la modalità asincrona e AsyncGetter da zabbix_utils:
import asyncio
from zabbix_utils import AsyncGetter
# 2. Definisci la funzione principale async in cui verranno eseguite tutte le richieste di dati:
async def main():
agent = AsyncGetter(host='192.0.2.1', port=10050)
# 3. Recupera il valore system.uname da agent Zabbix (deve essere preceduto da await):
response = await agent.get('system.uname')
# 4. Stampa il valore restituito da agent Zabbix:
print(response.value)
# 5. Esegui la funzione main() asincrona usando il loop di eventi di asyncio:
asyncio.run(main())