Collecter des données depuis l'agent Zabbix
Vue d’ensemble
zabbix_utils vous permet de collecter des données depuis l’agent Zabbix (de manière similaire à Zabbix get).
Les données peuvent être collectées en mode synchrone ou asynchrone :
- En mode synchrone, votre script Python demande les données et attend de les recevoir avant de continuer, ce qui convient aux opérations simples, séquentielles et prévisibles.
- En mode asynchrone, le script demande les données sans attendre chaque réponse, ce qui permet à d’autres opérations de se poursuivre en parallèle ; cela est plus efficace pour les requêtes lentes ou les lots de données volumineux.
Les exemples de cette page se concentrent sur le mode synchrone, bien que le mode asynchrone suive des principes similaires. Des exemples supplémentaires sont disponibles dans le dépôt GitHub zabbix_utils.
Importation
Pour utiliser zabbix_utils afin de collecter les valeurs des éléments, importez la classe Getter dans votre script Python :
from zabbix_utils import Getter
Données de requête
Pour demander la valeur d’un élément :
- Créez une instance de
Getter, en spécifiant l’adresse IP et le port de votre agent Zabbix. - Appelez la méthode
get()sur l’instanceGetter, en spécifiant la clé de l’élément que vous souhaitez récupérer.
Par exemple, pour demander des données pour l’élément system.uname :
agent = Getter(host='192.0.2.0', port=10050)
response = agent.get('system.uname')
Utilisation d’une adresse IP non par défaut
Si le serveur exécutant votre script possède plusieurs adresses IP, vous pouvez spécifier une source_ip que le Getter utilisera lors de la connexion à l’agent Zabbix :
agent = Getter(
host='192.0.2.0',
port=10050,
source_ip='10.10.7.1'
)
Utilisation du délai d’expiration
Vous pouvez définir un timeout de réponse pour le Getter afin de contrôler combien de temps votre script doit attendre une réponse de l’agent Zabbix avant d’abandonner :
agent = Getter(
host='192.0.2.0',
port=10050,
timeout=30
)
Utilisation du chiffrement
Le Getter n’inclut pas de prise en charge intégrée du chiffrement, mais vous pouvez l’ajouter en créant un wrapper à l’aide de bibliothèques tierces :
def psk_wrapper(sock, tls):
# ...
# Implémentation du wrapper TLS PSK pour le socket
# ...
agent = Getter(
host='192.0.2.0',
port=10050,
socket_wrapper=psk_wrapper
)
Réponse
La réponse de l'agent Zabbix est traitée par la bibliothèque et renvoyée sous la forme d'un objet 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
Mode asynchrone
Le mode asynchrone permet à votre script de collecter des valeurs sans attendre l’arrivée de chacune d’elles. Cela peut rendre votre script plus efficace lorsqu’il doit collecter de nombreuses valeurs ou lorsque certaines valeurs prennent beaucoup de temps à être collectées.
Lors de l’utilisation du mode asynchrone, il existe des différences importantes par rapport au mode synchrone :
- Importez le module
asynciode Python (vous devez d’abord installer les dépendances requises). - Importez
AsyncGetterau lieu deGetter. - Écrivez votre code dans une fonction
async. - Utilisez
awaitlors de l’appel de la méthodeget().
Par exemple, pour collecter une seule valeur en utilisant le mode asynchrone :
# 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())