[PYTHON] Comprendre le fonctionnement de l'API Zabbix

introduction

Zabbix peut être utilisé via API Zabbix, mais pour chaque langue [Zabbix API Library](https: //www.zabbix. Comme il existe plusieurs types d'organisations / wiki / Docs / api / bibliothèques), il est difficile de savoir lequel utiliser. De plus, l'API Zabbix dispose d'un grand nombre de méthodes (Référence de méthode) et d'options, donc l'une des différentes bibliothèques Il sera très difficile de sélectionner si seule la plage de garantie est utilisée pour la maintenance.

C'est ma théorie, mais je pense qu'il vaut mieux comprendre le livre même si cela prend du temps, plutôt que d'utiliser une bibliothèque qui n'a pas une image complète et aucune garantie de maintenance. Si vous souhaitez utiliser l'API Zabbix, mais que vous avez du mal avec la bibliothèque d'API Zabbix, c'est un gâchis.

Heureusement, l'API Zabbix fonctionne très simplement. Dans cet article, après avoir discuté de l'API Zabbix, je voudrais présenter une implémentation qui utilise l'API Zabbix au minimum. S'il y a des erreurs, je vous serais reconnaissant si vous pouviez le signaler gentiment.

JSON-RPC 2.0

L'API Zabbix utilise JSON-RPC 2.0 pour son protocole de requête-réponse. JSON-RPC est un protocole RPC (Remote Procedure Call) léger qui ne conserve pas l'état d'utilisation de JSON comme format de données. Les spécifications sont si courtes que leur lecture sera le moyen le plus simple et le plus précis de les comprendre. Par conséquent, seules les parties nécessaires pour l'explication ultérieure seront expliquées ici.

Une requête en JSON-RPC 2.0 se compose de jsonrpc, method, params et ʻid. jsonrpc est le numéro de version JSON-RPC, "2.0" , methodest le nom de la procédure à appeler,params est l'argument (facultatif) à passer à la procédure appelée, et ʻid est la chaîne de requête et de réponse. C'est un identifiant pour l'attachement et une valeur décidée côté client. C'est très simple à comprendre, il suffit d'envoyer le nom de la procédure et les arguments au format JSON.

JSON-RPC2.0 demande


{
    "jsonrpc": "2.0",
    "method": "hoge",
    "params": {
        "foo": "bar",
        "spam": "ham"
    },
    "id": 1
}

D'autre part, la réponse dans JSON-RPC 2.0 se compose de jsonrpc, result ou error, ʻid. jsonrpc est le numéro de version JSON-RPC" 2.0 ", result est la valeur de retour lorsque la demande est réussie, ʻerror est l'information d'erreur lorsque la demande échoue, et ʻid` correspond à la demande. Ce sera la même valeur que l'identifiant à utiliser. Comme la demande, le résultat ou l'erreur est simplement renvoyé au format JSON, ce qui est très facile à comprendre.

JSON en cas de succès-RPC2.0 réponse


{
    "jsonrpc": "2.0",
    "result": "hoge",
    "id": 1
}

JSON au moment de l'échec-RPC2.0 réponse


{
    "jsonrpc": "2.0",
    "error": {
        "code": -32602,
        "message": "Invalid params",
        "data": "hogehoge"
    },
    "id": 1
}

Zabbix API

La seule différence entre l'API Zabbix et la section JSON-RPC 2.0 est que la requête inclut ʻauth. ʻAuth est un jeton pour l'authentification de l'utilisateur, qui peut être obtenu en appuyant sur la méthode ʻuser.login dans l'API Zabbix. Lorsque vous appuyez sur la méthode ʻuser.login, ʻauth peut être null`.

json:Demander un exemple dans l'API Zabbix(www.zabbix.com/documentation/2.2/manual/À partir de l'API)


{
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
        "user": "Admin",
        "password": "zabbix"
    },
    "id": 1,
    "auth": null
}

json:Exemple de réponse dans l'API Zabbix(www.zabbix.com/documentation/2.2/manual/À partir de l'API)


{
    "jsonrpc": "2.0",
    "result": "0424bd59b807674191e7d77572075f33",
    "id": 1
}

Si vous pouvez obtenir le jeton comme valeur de retour de la méthode ʻuser.login, tout ce que vous avez à faire est de mettre le jeton dans ʻauth et de l'échanger selon le mécanisme de demande-réponse de JSON-RPC 2.0.

json:Exemple de demande dans l'API Zabbix lorsque l'authentification est spécifiée(www.zabbix.com/documentation/2.2/manual/À partir de l'API)


{
    "jsonrpc": "2.0",
    "method": "host.get",
    "params": {
        "output": [
            "hostid",
            "host"
        ],
        "selectInterfaces": [
            "interfaceid",
            "ip"
        ]
    },
    "id": 2,
    "auth": "0424bd59b807674191e7d77572075f33"
}

json:Exemple de réponse dans l'API Zabbix lorsque l'authentification est spécifiée(www.zabbix.com/documentation/2.2/manual/À partir de l'API)


{
    "jsonrpc": "2.0",
    "result": [
        {
            "hostid": "10084",
            "host": "Zabbix server",
            "interfaces": [
                {
                    "interfaceid": "1",
                    "ip": "127.0.0.1"
                }
            ]
        }
    ],
    "id": 2
}

Implémentation minimale à l'aide de l'API Zabbix

Si vous souhaitez utiliser l'API Zabbix au minimum, il suffit de créer la classe suivante. Authentifiez-vous lors de la création d'une instance, maintenez le jeton dans l'instance, puis donnez method et params de manière appropriée pour recevoir une réponse. La réponse doit contenir "result" en cas de succès et "erreur" en cas d'échec, donc branchez et processus.

Extraits de code qui utilisent l'API Zabbix au minimum et exemples de leur utilisation


# -*- coding: utf-8 -*-

import json
import urllib
import urllib2


class ZabbixApi(object):
    def __init__(self, host, user, password):
        """Renvoie une instance d'API Zabbix

        :param host:Adresse IP du serveur Zabbix
        :param user:Utilisateur d'accès à l'API Zabbix
        :param password:Mot de passe de l'utilisateur d'accès à l'API Zabbix
        :return:
        """
        self.request_id = 1
        self.host = host
        self.auth_token = self.request('user.login', {'user': user, 'password': password})


    def request(self, method, params, auth_token=None):
        """Envoyez une requête à l'API Zabbix
Puisque id n'est pas actuellement requis, la valeur incrémentée est simplement substituée.

        :param method:Nom de la méthode de l'API Zabbix
        :param params:Arguments de la méthode de l'API Zabbix
        :param auth_token:Jeton d'authentification de l'API Zabbix
        :return: JSON-RPC2.0 réponse au format
        """
        if hasattr(self, 'auth_token'):
            auth_token = self.auth_token
        headers = {"Content-Type": "application/json-rpc"}
        uri = "http://{0}/zabbix/api_jsonrpc.php".format(self.host)
        data = json.dumps({'jsonrpc': '2.0',
                           'method': method,
                           'params': params,
                           'auth': auth_token,
                           'id': self.request_id})
        request = urllib2.Request(uri, data, headers)
        self.request_id += 1
        return json.loads(urllib2.urlopen(request).read())


if __name__ == '__main__':
    api = ZabbixApi(192.168.0.2, 'Admin', 'zabbix')
    response = api.request('host.get', {'output': 'hostid', 'search': {'host': 'hoge'}})
    if 'result' in response:
        pass #Traitement en cas de succès
    elif 'error' in response:
        pass #Traitement au moment de l'échec
    else:
        pass #Traitement au moment de l'échec

En fait, certaines des bibliothèques d'API Zabbix ne sont que du code avec le contenu ci-dessus. Donc, tant que vous comprenez JSON-RPC 2.0 et ʻauth`, il peut être plus facile ultérieurement d'implémenter l'implémentation légère dont vous avez besoin, plutôt que de déployer des bibliothèques inutiles.

Résumé

Dans cet article, j'ai brièvement expliqué le JSON-RPC 2.0 utilisé par l'API Zabbix, abordé le fonctionnement de l'API Zabbix et présenté une implémentation permettant d'utiliser l'API Zabbix au minimum.

La documentation de l'API Zabbix est si énorme qu'il est facile de la submerger et de penser que c'est difficile, mais lorsque vous vous asseyez et que vous la regardez, c'est vraiment simple et facile à comprendre. Il peut être difficile de décider quel type d'argument doit être passé à la méthode ...

Nous espérons que cet article réduira les obstacles à l'API Zabbix et conduira à un fonctionnement plus sécurisé.

Recommended Posts

Comprendre le fonctionnement de l'API Zabbix
Comprendre comment fonctionne le différé de Go
Hit l'API Zabbix (1.8, 2.0)
Fonctionnement de l'importation de modules Python
Comprendre comment utiliser django-filter
Obtenir des informations avec l'API Zabbix
API Zabbix ceci et cela
Comment utiliser l'API Python d'OpenPose
Compréhension du mécanisme Twilio # 1 - Introduction
Comment utiliser l'API Bing Search
[Python] Comment utiliser l'API Typetalk