【5.0対応済】Python3でZabbix API – ユーザーの一覧を取得する

Python,Zabbix,Zabbix API

こんにちは。プラットフォーム技術部の近藤 凌です。

以前の記事で「Zabbix APIを使ったホスト一覧の取得方法」を紹介しました。今回の記事はそのユーザー版、ということで「Zabbix APIを使ったユーザー一覧の取得方法」について解説します。

Zabbixにおいて、ユーザーは「Webインターフェースにアクセスするアカウント」「障害通知の送信先」という2つの役割を担っています。

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

ユーザー1人の情報を取得する

まずは、Zabbix APIを使ってユーザー1人の情報を取得してみます。使用するメソッドは、user.getです。公式マニュアルはこちらです。

要求フォーマット

{
    "jsonrpc": "2.0",
    "method": "user.get",
    "params": {
        "output": "extend"
        "filter": {
            "alias": "Admin"
        }
    },
    "auth": "********************************",
    "id": 1
}

応答フォーマット

{
    "jsonrpc": "2.0",
    "result": [
        {
            "userid": "1",
            "alias": "Admin",
            "name": "Zabbix",
            "surname": "Administrator",
            "url": "",
            "autologin": "1",
            "autologout": "0s",
            "lang": "ru_RU",
            "refresh": "0s",
            "type": "3",
            "theme": "default",
            "attempt_failed": "0",
            "attempt_ip": "",
            "attempt_clock": "0",
            "rows_per_page": "50"
        },
    ],
    "id": 1
}

「surname(姓)」など、ユーザーに関連しそうな情報が並んでいます。それぞれについて説明します。

ユーザー情報の概要(User object)

公式マニュアルはこちらです。

英語だとわかりにくいので、日本語化してみました。

プロパティ宣言型説明
useridstringユーザーのID(読み取り専用)
alias(必須)stringユーザーのエイリアス
attempt_clocktimestamp最後にログインに失敗した時間(読み取り専用)
attempt_failedinteger直近のログインに失敗した回数(読み取り専用)
attempt_ipstring最後にログインに失敗した時の接続元のIPアドレス
autologinintegerオートログインの有効/無効
0:無効(既定値)
1:有効
autologoutstringセッションが有効な時間
秒数と末尾に時間単位がついた数値を受け入れる。
0sを設定するとセッションが切れなくなる。
既定値:15秒
langstringユーザーが設定している言語の言語コード
既定値:en_GB
namestringユーザーの名
refreshstring自動再読み込みの間隔
秒数と末尾に時間単位がついた数値を受け入れる。
既定値:30s
rows_per_pageintegerページに表示されるオブジェクト行の量
既定値:50
surnamestringユーザーの姓
themestringユーザーのWeb UIのテーマ
default:システムデフォルト(既定値)
blue-theme:ブルー
dark-theme:ダーク
typeintegerユーザーのタイプ
1:Zabbix user(既定値)
2:Zabbix admin
3:Zabbix super admin
urlstringログイン後にユーザーをリダイレクトするページのURL

ユーザー「Admin」を取得する

では、実際にユーザーの情報を取得してみましょう。

Zabbix Appliance構築時に設定されている「Admin」ユーザーの情報を取得します。実装は、以前の記事で紹介した「ログイン~ログアウト、一連の流れ」をもとにしておこないます。以前の記事はこちらです。

以下のプログラムの中で、ハイライトしている部分がユーザー固有の実装です。
Zabbixサーバーに情報を取得したいユーザーエイリアスを渡すと、Zabbixサーバーの応答(result)の中に配列(list)、その中に辞書(dictionary)を格納した階層構造でユーザー情報を返却します。

「今回はユーザー1人分の情報を取得するのでは?」と思われるかもしれませんが、Zabbix APIはユーザーの人数に関係なく、配列の中に情報を格納してきます。

import os
import traceback
from function import login, logout, invoke

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

    alias = [
        "Admin"
    ]

    try:
        session_id = login(server, user, password)
        if 0 < len(session_id):
            request = {
                    "jsonrpc": "2.0",
                    "method": "user.get",
                    "params": {
                        "filter": {
                            "alias": alias
                        },
                    },
                    "auth": session_id,
                    "id": 1
                }

            response = {}
            if invoke(server, request, response):
                for item in response["result"]:
                    for key, value in item.items():
                        print("{}: {}".format(key, value))
  
            else:
                print("{}: error: message={}, data={}, code={}".format(
                    os.path.basename(__file__),
                    response["error"]["message"],
                    response["error"]["data"],
                    response["error"]["code"])
                )
                
    
    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()

実行結果

PS C:\zabbixapi\sample> python3 .\sample-11.py
userid: 1
alias: Admin
name: Zabbix
surname: Administrator
url:
autologin: 1
autologout: 0
lang: ja_JP
refresh: 30s
type: 3
theme: default
attempt_failed: 0
attempt_ip:
attempt_clock: 1638866589
rows_per_page: 50

「Admin」のユーザー情報が取得できました!

ユーザーの一覧を取得する

要求パラメータを変更すれば、ユーザーの一覧を簡単に取得できます。早速実装しましょう。

要求フォーマット

{
    "jsonrpc": "2.0",
    "method": "user.get",
    "params": {
        "output": "extend",
    },
    "auth": "********************************",
    "id": 1
}

応答フォーマット

ユーザーエイリアスを指定して取得した時の応答フォーマットと同じです。

プログラム

ユーザー1人の情報を取得した時のプログラムをもとに、以下のハイライトしている部分を改造しています。また、ユーザーエイリアスを指定する必要がなくなりましたので、ユーザーエイリアスの配列(alias=[“Admin"])も削除しました。

import os
import traceback
from function import login, logout, invoke

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

    try:
        session_id = login(server, user, password)
        if 0 < len(session_id):
            request = {
                    "jsonrpc": "2.0",
                    "method": "user.get",
                    "params": {
                            "output": "extend"
                    },
                    "auth": session_id,
                    "id": 1
                }

            response = {}
            if invoke(server, request, response):
                for item in response["result"]:
                    print("---ユーザー情報---")
                    for key, value in item.items():
                        print("{}: {}".format(key, value))
  
            else:
                print("{}: error: message={}, data={}, code={}".format(
                    os.path.basename(__file__),
                    response["error"]["message"],
                    response["error"]["data"],
                    response["error"]["code"])
                )
                
    
    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()

実行結果

PS C:\zabbixapi\sample> python3 .\sample-12.py
---ユーザー情報---
userid: 1
alias: Admin
name: Zabbix
surname: Administrator
url:
autologin: 1
autologout: 0
lang: ja_JP
refresh: 30s
type: 3
theme: default
attempt_failed: 0
attempt_ip: 
attempt_clock: 1638866589
rows_per_page: 50
---ユーザー情報---
userid: 2
alias: guest
name:
surname:
url:
autologin: 0
autologout: 15m
lang: en_GB
refresh: 30s
type: 1
theme: default
attempt_failed: 0
attempt_ip:
attempt_clock: 0
rows_per_page: 50
---ユーザー情報---
userid: 3
alias: SampleUser
name: Sample
surname: User
url:
autologin: 0
autologout: 0
lang: ja_JP
refresh: 30s
type: 1
theme: blue-theme
attempt_failed: 0
attempt_ip:
attempt_clock: 0
rows_per_page: 50

ユーザーの一覧が取得できました!

ユーザーのメディア情報も一緒に取得する

冒頭でも少し触れましたが、Zabbixにおいてユーザーは「障害通知の送信先」としての役割も担っています。ユーザーが登録しているメディア情報、つまり送信先の情報も要求パラメーターを変えるだけで一緒に取得できます。

要求フォーマット

{
    "jsonrpc": "2.0",
    "method": "user.get",
    "params": {
        "output": "extend"
        "selectMedias": "extend"
    },
    "auth": "********************************",
    "id": 1
}

応答フォーマット

{
    "jsonrpc": "2.0",
    "result": [
        {
            "userid": "1",
            "alias": "Admin",
            "name": "Zabbix",
            "surname": "Administrator",
            "url": "",
            "autologin": "1",
            "autologout": "0s",
            "lang": "ru_RU",
            "refresh": "0s",
            "type": "3",
            "theme": "default",
            "attempt_failed": "0",
            "attempt_ip": "",
            "attempt_clock": "0",
            "rows_per_page": "50"
            "medias": [
                {
                    'mediaid': '1',
                    'userid': '1',
                    'mediatypeid': '1',
                    'sendto': ['Zabbix-Administrator@example.com'],
                    'active': '0', 
                    'severity':'63',
                    'period': '1-7,00:00-24:00'
                }
           ]
        },
    ],
    "id": 1
}

メディア情報は、ユーザー情報の"medias"の要素として、配列(list)の中に辞書(dictionary)を持つ形で格納されています。それぞれについて説明します。

メディア情報の概要(Media object)

公式マニュアルはこちらです。(User objectと同じページにありますので再掲です)

英語だとわかりづらいので、こちらも日本語化してみました。

プロパティ宣言型説明
mediatypeid(必須)stringメディアが使用するメディアタイプのID
sendto(必須)string/array受信者のメールアドレス、ユーザー名、もしくは他の識別子
メディアタイプがEメールだった場合は値を配列で返却する。
そのほかの場合は値を文字列型で返却する。
activeintegerメディアの有効/無効
0:有効(既定値)
1:無効
severityinteger通知を送信する障害の深刻度
障害の深刻度はバイナリ形式で格納されており、深刻度はそれぞれのビットと対応している。
(例えば、12は2進数で表すと1100で、これは「軽度の障害」と「警告」の障害の通知が送信されることを意味する)
サポートされているトリガーの深刻度のリストは、Trigger objectのページを参照。
既定値:63
periodstringセミコロンで区切られたタイムピリオド形式もしくはユーザー定義マクロで設定された、通知を送れる時間帯
既定値:1-7,00:00-24:00

プログラム

では、ユーザーのメディア情報も一緒に取得してみましょう。

要求フォーマットを変更するだけでもメディア情報を取得できますが、それだけだとメディア情報の表示が横に長くなり見づらくなってしまいます。そこで、ユーザーの一覧を取得するプログラムをもとに、以下のハイライトした部分を改造してメディア情報も縦に並べるようにしています。

import os
import traceback
from function import login, logout, invoke

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

    try:
        session_id = login(server, user, password)
        if 0 < len(session_id):
            request = {
                    "jsonrpc": "2.0",
                    "method": "user.get",
                    "params": {
                        "output": "extend",
                        "selectMedias": "extend"
                    },
                    "auth": session_id,
                    "id": 1
                }

            response = {}
            if invoke(server, request, response):
                for item in response["result"]:
                    print("---ユーザー情報---")
                    for user_key, user_value in item.items():
                        if "medias" == user_key:
                            print("---メディア情報---")
                            for medias in user_value:
                                for medias_key, medias_value in medias.items():
                                    print("{}:{}".format(medias_key, medias_value))

                        else:
                            print("{}: {}".format(user_key, user_value))
                            
            else:
                print("{}: error: message={}, data={}, code={}".format(
                    os.path.basename(__file__),
                    response["error"]["message"],
                    response["error"]["data"],
                    response["error"]["code"])
                )
                
    
    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()

実行結果

PS C:\zabbixapi\sample> python3 .\sample-13.py
---ユーザー情報---
userid: 1
alias: Admin
name: Zabbix
surname: Administrator
url:
autologin: 1
autologout: 0
lang: ja_JP
refresh: 30s
type: 3
theme: default
attempt_failed: 0
attempt_ip: 
attempt_clock: 1638866589
rows_per_page: 50
---メディア情報---
mediaid:1
userid:1
mediatypeid:1
sendto:['Zabbix-Administrator@example.com']
active:0
severity:63
period:1-7,00:00-24:00
---ユーザー情報---
userid: 2
alias: guest
name:
surname:
url:
autologin: 0
autologout: 15m
lang: en_GB
refresh: 30s
type: 1
theme: default
attempt_failed: 0
attempt_ip:
attempt_clock: 0
rows_per_page: 50
---メディア情報---
---ユーザー情報---
userid: 3
alias: SampleUser
name: Sample
surname: User
url:
autologin: 0
autologout: 0
lang: ja_JP
refresh: 30s
type: 1
theme: blue-theme
attempt_failed: 0
attempt_ip:
attempt_clock: 0
rows_per_page: 50
---メディア情報---
mediaid:2
userid:3
mediatypeid:1
sendto:['Sample-User@example.com']
active:0
severity:63
period:1-7,00:00-24:00

ユーザーに登録してあるメディア情報も一緒に取得できました!

Zabbix4.0→5.0の変更点

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

まとめ

この記事では、Zabbix APIを呼び出して、ユーザー一覧を取得する実装を紹介しました。運用ユーザーが多くいる環境で、ユーザーの棚卸し作業をおこなう場合などに活用できるのではないでしょうか。

次回は「ユーザーを登録する方法」を紹介します。

アークシステムは Zabbix Japan LLC の認定パートナー企業です。 当社はZabbixバージョン1.1の時代から監視ソリューションの活用を進め、Zabbixに関する製品・サービスの販売に加え、Zabbix関連サービスの提供を行っています。

Zabbixに関するお問い合わせはこちらからお願いいたします。
  • 株式会社アークシステムの予約・来訪管理システム BRoomHubs
  • 低コスト・短納期で提供するまるごとおまかせZabbix