【5.0対応済】Python3でZabbix API – ホストグループを絞り込む

2021年4月13日Python,Zabbix,Zabbix API

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

前回、ホストグループの一覧を取得する方法について説明しましたが、今回はさらに検索条件を指定して絞り込む方法について説明します。

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

部分一致で検索する

前回の記事ではホストグループ名の完全一致で検索しましたが、部分一致で検索する場合は “search" パラメーターを使って検索します。

プログラム

以下のプログラムの中で、ハイライトしている部分が完全一致検索と異なる点です。

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": "hostgroup.get",
                "params": {
                    "output": "extend",
                    "search": {
                        "name": "servers"
                    }
                },
                "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-08.py
groupid: 2
name: Linux servers
internal: 0
flags: 0
groupid: 4
name: Zabbix servers
internal: 0
flags: 0

AND条件で検索する

“search" パラメーターを配列に変更し、複数の条件を設定します。ハイライトしている部分が変更点です。

プログラム

import os
import traceback
from function import login, logout, invoke
  
def main():
    server = "http://hostname/zabbix"
    user = "Admin"
    password = "******"
    session_id = ""

    names = [
        "zab",
        "servers"
    ]

    try:
        session_id = login(server, user, password)
        if 0 < len(session_id):
            request = {
                "jsonrpc": "2.0",
                "method": "hostgroup.get",
                "params": {
                    "output": "extend",
                    "search": {
                        "name": names
                    }
                },
                "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-09.py
groupid: 4
name: Zabbix servers
internal: 0
flags: 0

OR条件で検索する

AND条件で紹介したプログラムにパラメーター “searchByAny" を追加して、Trueを設定します。プログラムの説明がくどくなってきたので、抜粋にします(笑)

request = {
    "jsonrpc": "2.0",
    "method": "hostgroup.get",
    "params": {
        "output": "extend",
        "searchByAny": True,
        "search": {
            "name": names
        }
    },
    "auth": session_id,
    "id": 1
}

実行結果

PS C:\zabbixapi\sample> python3 .\sample-10.py
groupid: 2
name: Linux servers
internal: 0
flags: 0
groupid: 4
name: Zabbix servers
internal: 0
flags: 0

ワイルドカードを使って検索する

“searchWildcardsEnabled" パラメーターをTrueに設定します。そして、検索文字列に*を付けましょう。

request = {
    "jsonrpc": "2.0",
    "method": "hostgroup.get",
    "params": {
        "output": "extend",
        "searchWildcardsEnabled": True,
        "search": {
            "name": "Templates*"
        }
    },
    "auth": session_id,
    "id": 1
}

実行結果

PS C:\zabbixapi\sample> python3 .\sample-11.py
groupid: 1
name: Templates
internal: 0
flags: 0
groupid: 8
name: Templates/Modules
internal: 0
flags: 0
groupid: 9
name: Templates/Network devices
internal: 0
flags: 0
groupid: 10
name: Templates/Operating systems
internal: 0
flags: 0
groupid: 11
name: Templates/Server hardware
internal: 0
flags: 0
name: Templates/Applications
internal: 0
flags: 0
groupid: 13
name: Templates/Databases
internal: 0
flags: 0
groupid: 14
name: Templates/Virtualization
internal: 0
flags: 0

検索条件に一致しないものを抽出する

“excludeSearch" パラメーターを使ってください。もちろんTrueに設定します。

request = {
    "jsonrpc": "2.0",
    "method": "hostgroup.get",
    "params": {
        "output": "extend",
        "searchWildcardsEnabled": True,
        "excludeSearch": True,
        "search": {
            "name": "Templates*"
        }
    },
    "auth": session_id,
    "id": 1
}

実行結果

PS C:\zabbixapi\sample> python3 .\sample-12.py
groupid: 2
name: Linux servers 
internal: 0
flags: 0
groupid: 4
name: Zabbix servers
internal: 0
flags: 0
name: Discovered hosts
internal: 1
flags: 0
groupid: 6
name: Virtual machines
internal: 0
flags: 0
groupid: 7
name: Hypervisors
internal: 0
flags: 0

テンプレートが含まれるホストグループの一覧を取得する

“templated_hosts" というパラメーターもあります。Trueに設定することで、当該条件の絞り込みができます。試したところ、"excludeSearch" パラメーターとの併用はできませんでした。

request = {
    "jsonrpc": "2.0",
    "method": "hostgroup.get",
    "params": {
        "output": "extend",
        "templated_hosts": True
    },
    "auth": session_id,
    "id": 1
}

実行結果

PS C:\zabbixapi\sample> python3 .\sample-13.py
name: Templates/Modules
internal: 0
flags: 0
groupid: 9
name: Templates/Network devices
internal: 0
flags: 0
groupid: 10
name: Templates/Operating systems
internal: 0
flags: 0
groupid: 11
name: Templates/Server hardware
internal: 0
flags: 0
groupid: 12
name: Templates/Applications
internal: 0
flags: 0
groupid: 13
name: Templates/Databases
internal: 0
flags: 0
groupid: 14
name: Templates/Virtualization
internal: 0
flags: 0

まとめ

Zabbix APIにはさまざまな検索条件が準備されています。今回はホストグループを用いて説明しましたが、ホストの一覧を取得する際にも同様なパラメーターを用いて絞り込み検索ができます。

今回紹介したパラメーターは、以下の公式のマニュアルに記載されています。

そして、読んでいただいた方には察していただけたかと思いますが、ホストグループの一覧からテンプレート格納用に準備されたホストグループを除外したかったのです(涙)

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

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