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 :

  1. Créez une instance de Getter, en spécifiant l’adresse IP et le port de votre agent Zabbix.
  2. Appelez la méthode get() sur l’instance Getter, 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 asyncio de Python (vous devez d’abord installer les dépendances requises).
  • Importez AsyncGetter au lieu de Getter.
  • Écrivez votre code dans une fonction async.
  • Utilisez await lors de l’appel de la méthode get().

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())