【5.0対応済】Python3でZabbix API – 認証処理(ログインとログアウト)

2020年8月18日Python,Zabbix,Zabbix API

こんにちは。プラットフォーム技術部の飯出(いいで)です。

このZabbix APIの紹介記事、今後も連載形式で続けていきたいと考えていますが、前回の連載記事「わたしに♥おまかせZabbix」とは違い、齢40を超えた見苦しいおっさんが執筆しています(汗)

女子力全開の記事がお好みの方は、以下のリンクからお願いします。

さて、今回はZabbix APIの認証処理をPython3で実装します。

Zabbix APIを使ってZabbix内部のデータにアクセスするには、まずログインして認証トークンを取得し、認証トークンを使いながら実際のデータにアクセスします。この記事では、ログインをして認証トークンを取得する方法と、その後ログアウトして認証トークンを破棄する方法について説明します。

この記事の実装サンプルでは、以前の記事で実装した内容を再利用して説明しています。Googleなどの検索結果から直接この記事に訪れた方は、一度、以下の記事を読んでいただけますと幸いです。

ログイン処理の実装

早速ですが、Pythonを使ってZabbixにログインします。使用するメソッドは、user.loginです。そして、公式のマニュアルはこちらです。

要求フォーマット

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

応答フォーマット

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

再利用できるように、関数にする

Zabbixの内部データを扱うために毎回ログイン処理を実装するのは手間ですね。ログイン処理は関数にして、他のZabbix APIを呼び出す場合に再利用しましょう。前回の記事で作成したfunction.pyに追記する形が良いと思います。

この実装サンプルは、ZabbixサーバーにZabbix APIでログインをした結果、そこで得た認証トークンを呼び出し元に返却します。

import os

def login(server, user, password):
    session_id = ""
    request = {
        "jsonrpc": "2.0",
        "method": "user.login",
        "params": {
            "user": user,
            "password": password
        },
        "id": 1
    }

    try:
        response = {}
        if invoke(server, request, response):
            session_id = response["result"]

        else:
            print("{}: error: message={}, data={}, code={}".format(
                os.path.basename(__file__),
                response["error"]["message"],
                response["error"]["data"],
                response["error"]["code"])
            )

    except:
        raise

    return session_id

17行目のinvokeメソッドについては、前回の記事で説明しています。前回の記事はこちら。

関数に渡す引数と戻り値の説明

  • server [in]
    文字列(str)値、ZabbixサーバーのURLを渡します。例)http://hostname/zabbix
  • user [in]
    文字列(str)値、ログインに用いるユーザー。Zabbixフロントエンド(WebUI)にログインするときと同じものです。
  • password [in]
    文字列(str)値、ユーザーが認証に使うパスワード文字列です。
  • 戻り値
    文字列(str)値、ログインに成功すると認証トークンを返します。そうでない場合は空("")

ログアウト処理の実装

続いて、ログアウト処理を実装します。使用するメソッドは、user.logoutです。公式のマニュアルはこちらです。

ログアウトはちゃんとしましょう。「ドアを開けたら閉める」と同じですよね。公式のマニュアルにも、ログアウトしてくださいと書いてあります。

When using this method, you also need to do user.logout to prevent the generation of a large number of open session records.

user.login [Zabbix Documentation 5.0]

要求フォーマット

{
    "jsonrpc": "2.0",
    "method": "user.logout",
    "params": [],
    "id": 1,
    "auth": "********************************"
}

応答フォーマット

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

こちらも関数にする

ログインと同じく、再利用しましょう。

import os

def logout(server, session_id):
    result = False
    request = {
        "jsonrpc": "2.0",
        "method": "user.logout",
        "params": [],
        "id": 1,
        "auth": session_id
    }

    try:
        response = {}
        result = invoke(server, request, response)
        if result:
            result = response["result"]

        else:
            print("{}: error: message={}, data={}, code={}".format(
                os.path.basename(__file__),
                response["error"]["message"],
                response["error"]["data"],
                response["error"]["code"])
            )

    except:
        raise

    return result

関数に渡す引数と戻り値の説明

  • server [in]
    文字列(str)値、ZabbixサーバーのURLを渡します。例)http://hostname/zabbix
  • session_id [in]
    文字列(str)値、ログイン時に取得した認証トークンです。
  • 戻り値
    真偽(bool)値、Zabbix APIの呼び出しに成功した場合はTrue、そうでない場合はFalse
    「ログアウトでエラーを返されても困る」とか言わないでくださいね(笑)

ログイン~ログアウト、一連の流れ

これまでに作成したログイン処理ならびにログアウト処理を呼び出してみます。実際にZabbix内部のデータにアクセスするときは、15行目に記載しているpassの部分を書き換えます。

import os
import traceback
from function import login, logout

def main():
    server = "http://hostname/zabbix"
    user = "Admin"
    password = "******"
    session_id = ""

    try:
        session_id = login(server, user, password)
        if 0 < len(session_id):
            # この中でZabbix内部のデータにアクセスします
            pass

    except Exception as e:
        print("{}: exception: {}".format(
            os.path.basename(__file__),
            traceback.format_exc())
        )

    finally:
        if 0 < len(session_id):
            # ログインしたら、忘れずにログアウトしましょう
            logout(server, session_id)

if __name__ == "__main__":
    main()

これで、Zabbix内部のデータにアクセスする準備ができました。今回の実装は、ここまで。

Zabbix 4.0→5.0の変更点

今回もバージョンアップによる影響はありません。

おまけ:ログインしたユーザーの情報をログイン時に取る

ログインと同時に、ログインしたユーザーの情報を取得できます。実装だけ紹介しましょう。なお、公式のマニュアルには、以下の記載があります。

Parameter: userData
Type: flag
Description: Return information about the authenticated user.

user.login [Zabbix Documentation 5.0]

実装方法

先ほど作ったログイン処理の実装に、少し手を加えます。11行目、userDataをTrueにセットしてからuser.loginメソッドを呼び出すと、Zabbixサーバーからの応答が変化します。(19~25行目)

応答データの詳細については後日、ユーザー情報の取得方法を紹介するときに説明します。

import os

def login(server, user, password):
    session_id = ""
    request = {
        "jsonrpc": "2.0",
        "method": "user.login",
        "params": {
            "user": user,
            "password": password,
            "userData": True
        },
        "id": 1
    }

    try:
        response = {}
        if invoke(server, request, response):
            session_id = response["result"]["sessionid"]

            print("User ID = {}".format(response["result"]["userid"]))
            print("Alias = {}".format(response["result"]["alias"]))
            print("Name = {}".format(response["result"]["name"]))
            print("Surname = {}".format(response["result"]["surname"]))
            ### 以下、略 ###

        else:
            print("{}: error: message={}, data={}, code={}".format(
                os.path.basename(__file__),
                response["error"]["message"],
                response["error"]["data"],
                response["error"]["code"])
            )

    except:
        raise

    return session_id

使うことは、あまりないかな(笑)
あえて言えば証跡としてログ出力するとか監査対応などの用途くらい…でしょうか。

まとめ

この記事では、Zabbix APIを呼び出してZabbixサーバーにログイン、またはログアウトする実装を紹介しました。

非常に膨大な量のZabbix APIのドキュメントを見て、その物量に圧倒されたり日本語版ドキュメントが存在しなかったりなど、難しいものと思い込んでしまいますが、この記事を読んでいただきハードルが下がればいいなと思っています。

次回は「ホストの一覧を取得する方法」を紹介したいと思います。

Zabbixの導入・構築でお困りですか?

Zabbixの導入・構築でお困りですか?アークシステムは、Zabbix Japan LLCの公式認定パートナーとして、豊富な実績と高い技術力でお客様をサポートします。

アークシステムが選ばれる理由

  • 豊富な経験: 多くのZabbix導入・構築プロジェクトを成功に導いた実績
  • 確かな技術力: Zabbix認定資格を持つエンジニアが対応
  • 独自のソリューション: 「監視定義テンプレート」を活用した迅速かつ高品質な実装
  • 最新情報へのアクセス: Zabbix社との強力なパートナーシップを活かした最新技術対応

こんな方に最適です

  • Zabbixの新規導入を検討している
  • 現行システムの運用に課題を感じている
  • 大規模環境での監視体制を整えたい

アークシステムでは、Zabbixの導入・運用に関する課題を解決し、最適な環境を構築します。どんなご相談でもお気軽にお問い合わせください!

  • Zabbix Enterprise Appliance
  • 低コスト・短納期で提供するまるごとおまかせZabbix