[PYTHON] Verstehen Sie, wie die Zabbix-API funktioniert

Einführung

Zabbix kann über Zabbix API betrieben werden, jedoch für jede Sprache [Zabbix API Library](https: //www.zabbix). Da es mehrere Arten von org / wiki / Docs / api / library gibt, ist es schwierig zu wissen, welche verwendet werden soll. Darüber hinaus verfügt die Zabbix-API über eine Vielzahl von Methoden (Methodenreferenz) und Optionen, also über eine der verschiedenen Bibliotheken Die Auswahl ist sehr schwierig, wenn nur der Garantiebereich für die Wartung verwendet wird.

Dies ist meine Theorie, aber ich denke, es ist besser, das Buch zu verstehen, auch wenn es Zeit braucht, als eine Bibliothek zu verwenden, die kein vollständiges Bild und keine Garantie für die Wartung hat. Wenn Sie die Zabbix-API verwenden möchten, aber Schwierigkeiten mit der Zabbix-API-Bibliothek haben, ist dies ein Chaos.

Zum Glück funktioniert die Zabbix-API sehr einfach. In diesem Artikel möchte ich nach der Erörterung der Zabbix-API eine Implementierung vorstellen, die die Zabbix-API auf ein Minimum reduziert. Wenn es irgendwelche Fehler gibt, würde ich es begrüßen, wenn Sie kindly darauf hinweisen könnten.

JSON-RPC 2.0

Die Zabbix-API verwendet JSON-RPC 2.0 für ihr Anforderungs-Antwort-Protokoll. JSON-RPC ist ein leichtes RPC-Protokoll (Remote Procedure Call), das den Status der Verwendung von JSON als Datenformat nicht beibehält. Die Spezifikationen sind so kurz, dass das Lesen die einfachste und genaueste Möglichkeit ist, sie zu verstehen. Daher werden hier nur die Teile erläutert, die für die spätere Erklärung erforderlich sind.

Eine Anforderung in JSON-RPC 2.0 besteht aus "jsonrpc", "method", "params" und "id". "jsonrpc" ist die JSON-RPC-Versionsnummer, "2.0", "method" ist der Name der aufzurufenden Prozedur, "params" ist das Argument (optional), das an die aufgerufene Prozedur übergeben werden soll, und "id" ist die Anforderungs- und Antwortzeichenfolge. Es ist eine Kennung zum Anhängen und ein Wert, der auf der Clientseite festgelegt wird. Es ist sehr einfach zu verstehen, senden Sie einfach den Prozedurnamen und die Argumente im JSON-Format.

JSON-RPC2.0 Anfrage


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

Andererseits besteht die Antwort in JSON-RPC 2.0 aus "jsonrpc", "result" oder "error", "id". "jsonrpc" ist die Versionsnummer von JSON-RPC, "2.0", "result" ist der Rückgabewert, wenn die Anforderung erfolgreich ist, "error" ist die Fehlerinformation, wenn die Anforderung fehlschlägt, und "id" entspricht der Anforderung. Dies ist derselbe Wert wie der zu verwendende Bezeichner. Wie bei der Anforderung wird das Ergebnis oder der Fehler nur im JSON-Format zurückgegeben, das sehr einfach zu verstehen ist.

JSON über den Erfolg-RPC2.0 Antwort


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

JSON zum Zeitpunkt des Ausfalls-RPC2.0 Antwort


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

Zabbix API

Der einzige Unterschied zwischen der Zabbix-API und dem Abschnitt JSON-RPC 2.0 besteht darin, dass die Anforderung "auth" enthält. auth ist ein Token für die Benutzerauthentifizierung und kann durch Klicken auf die Methode user.login in der Zabbix-API abgerufen werden. "Auth" kann "null" sein, wenn die Methode "user.login" gedrückt wird.

json:Beispiel in der Zabbix-API anfordern(www.zabbix.com/documentation/2.2/manual/Von api)


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

json:Antwortbeispiel in der Zabbix-API(www.zabbix.com/documentation/2.2/manual/Von api)


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

Wenn Sie das Token als Rückgabewert der Methode "user.login" erhalten können, müssen Sie das Token nur in "auth" einfügen und es gemäß dem Request-Response-Mechanismus von JSON-RPC 2.0 austauschen.

json:Beispiel in der Zabbix-API anfordern, wenn auth angegeben ist(www.zabbix.com/documentation/2.2/manual/Von api)


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

json:Antwortbeispiel in der Zabbix-API, wenn auth angegeben ist(www.zabbix.com/documentation/2.2/manual/Von api)


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

Minimale Implementierung mit der Zabbix-API

Wenn Sie die Zabbix-API mindestens verwenden möchten, reicht es aus, die folgende Klasse zu erstellen. Authentifizieren Sie sich beim Erstellen einer Instanz, halten Sie das Token in der Instanz und geben Sie dann "method" und "params" entsprechend ein, um eine Antwort zu erhalten. Die Antwort sollte "Ergebnis" bei Erfolg und "Fehler" bei Fehler enthalten, also verzweigen und verarbeiten.

Codefragmente, die die Zabbix-API auf ein Minimum beschränken, und Beispiele für ihre Verwendung


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

import json
import urllib
import urllib2


class ZabbixApi(object):
    def __init__(self, host, user, password):
        """Gibt eine Zabbix-API-Instanz zurück

        :param host:IP-Adresse des Zabbix-Servers
        :param user:Zabbix API-Zugriffsbenutzer
        :param password:Zabbix API-Zugriffskennwort
        :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):
        """Senden Sie eine Anfrage an die Zabbix-API
Da id derzeit nicht erforderlich ist, wird der inkrementierte Wert einfach ersetzt.

        :param method:Name der Zabbix-API-Methode
        :param params:Argumente der Zabbix-API-Methode
        :param auth_token:Zabbix API-Authentifizierungstoken
        :return: JSON-RPC2.Antwort im Format 0
        """
        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 #Verarbeitung auf Erfolg
    elif 'error' in response:
        pass #Verarbeitung zum Zeitpunkt des Ausfalls
    else:
        pass #Verarbeitung zum Zeitpunkt des Ausfalls

Tatsächlich sind einige der Zabbix-API-Bibliotheken nur Code mit dem oben genannten Inhalt. Solange Sie JSON-RPC 2.0 und "auth" verstehen, ist es möglicherweise später einfacher, eine kompakte Implementierung zu implementieren, die Ihren Anforderungen entspricht, als unnötige Bibliotheken bereitzustellen.

Zusammenfassung

In diesem Artikel habe ich kurz den von der Zabbix-API verwendeten JSON-RPC 2.0 erläutert, die Funktionsweise der Zabbix-API erläutert und eine Implementierung eingeführt, um die Zabbix-API auf ein Minimum zu beschränken.

Die Dokumentation der Zabbix-API ist so umfangreich, dass es leicht ist, sie zu überwältigen und für schwierig zu halten. Wenn Sie sich jedoch hinsetzen und sie ansehen, ist sie wirklich einfach und leicht zu verstehen. Es kann schwierig sein zu entscheiden, welche Art von Argument an die Methode übergeben werden soll ...

Wir hoffen, dass dieser Artikel die Hürden für die Zabbix-API verringert und zu einem sichereren Betrieb führt.

Recommended Posts

Verstehen Sie, wie die Zabbix-API funktioniert
Verstehe, wie Go's Defer funktioniert
Drücken Sie die Zabbix-API (1.8, 2.0)
So funktioniert der Import von Python-Modulen
Verstehen Sie, wie man Django-Filter verwendet
Informationen erhalten Sie mit zabbix api
Zabbix API dies und das
Verwendung der Python-API von OpenPose
Verständnis aus dem Mechanismus Twilio # 1 - Einführung
Wie benutzt man Bing Search API?
[Python] Verwendung der Typetalk-API