【5.0対応済】Python3でZabbix API – ホストインベントリの登録
こんにちは。プラットフォーム技術部の斉藤 翔平です。
前回の記事ではホストにホストインターフェースを登録する方法について説明しました。今回はホストにホストインベントリを登録する方法について解説します。
ホストインベントリはホストごとに対象機器のハードウェア情報、設置場所や連絡先などのさまざまな情報を設定できます。
そして設定した情報は、Webコンソール上のフィルターや障害通知メールの本文などで活用できます。
例えばWebコンソール上では、「監視データ-障害」や「インベントリ-ホスト」の画面でフィルターとして使用でき、もしOSやミドルウェアの脆弱性、ハードウェアやファームウェアの不具合などが発見された場合は「インベントリ-ホスト」の画面から迅速に該当機器を集計できます。
また障害通知メールでは、アクションの実行内容でホストインベントリ情報のマクロ指定が可能となり、メール本文にホストごとの詳細な情報を追加できるようになります。
詳細な情報を障害通知メールに載せることで、運用者がメールを読むだけで対応に必要なホスト情報を素早く取得でき、障害対応時の初動を早められるといったメリットがあります。
これらのようにホストインベントリを設定し活用することで、脆弱性、不具合の対応や障害発生後の対応などさまざまな場面でメリットを享受できます。
それでは実際にZabbix APIを用いてホストインベントリを登録する方法を紹介します。
この記事の実装サンプルでは、以前の記事で実装した内容を再利用して説明しています。Googleなどの検索結果から直接この記事に訪れた方は、一度、以下の記事を読んでいただけますと幸いです。
ホストインベントリの情報を登録する
ホストインベントリの登録には、2種類の方法があります。1つ目はホストの登録時にホストインベントリも登録する方法、2つ目は登録済みのホストにホストインベントリを追加する方法です。
ホストの登録時にホストインベントリを登録する
使用するメソッドは、host.createです。公式のマニュアルはこちらです。
要求フォーマット
{
"jsonrpc": "2.0",
"method": "host.create",
"params": {
"host": "Linux server",
"interfaces": [
{
"type": 1,
"main": 1,
"useip": 1,
"ip": "192.168.3.1",
"dns": "",
"port": "10050"
}
],
"groups": [
{
"groupid": "50"
}
],
"tags": [
{
"tag": "Host name",
"value": "Linux server"
}
],
"templates": [
{
"templateid": "20045"
}
],
"macros": [
{
"macro": "{$USER_ID}",
"value": "123321"
}
],
"inventory_mode": 0,
"inventory": {
"macaddress_a": "01234",
}
},
"auth": "********************************",
"id": 1
}
ホストを登録する方法ではホストグループとホストインターフェースを設定しましたが、パラメーターを追加することによってタグ、テンプレート、マクロならびにホストインベントリを登録できます。
今回はホストインベントリのパラメーターを追加して、ホストインベントリを登録します。
登録済みのホストにホストインベントリを追加する
使用するメソッドは、host.updateです。公式のマニュアルはこちらです。
要求フォーマット
{
"jsonrpc": "2.0",
"method": "host.update",
"params": {
"hostid": 10387,
"inventory_mode": 0,
"inventory": {
"location": "Latvia, Riga",
}
},
"auth": "********************************",
"id": 1
}
上記の例では、ホストインベントリの「場所」を登録しています。
また登録済みのホストにホストインベントリを追加する場合は、パラメーターに登録済みホストのIDも指定します。
応答フォーマット
{
"jsonrpc": "2.0",
"result": {
"hostids": [
"10387"
]
},
"id": 1
}
ホストインベントリの登録に成功すると、Zabbix APIはホストのIDを応答します。
登録パラメーターの概要
公式のマニュアルはこちらです。
ホストの登録に必要な基本パラメーターはホストの登録と削除で紹介していますので、こちらを参考にしていただけますと幸いです。
今回は追加で必要となるパラメーターを紹介します。
プロパティ | 宣言型 | 説明 |
---|---|---|
inventory_mode | integer | ホストインベントリのモード -1 : 無効(規定値) 0 : マニュアル 1 : 自動 |
ホストインベントリのモードを設定するパラメーターです。
ホストインベントリを使用するにはモードを「マニュアル」もしくは「自動」に設定する必要があります。
次にホストインベントリに登録できるパラメーターを紹介します。
ID | プロパティ | 宣言型 | 説明 |
---|---|---|---|
4 | alias | string | エイリアス |
11 | asset_tag | string | 資産タグ |
28 | chassis | string | シャーシ |
23 | contact | string | 連絡先 |
32 | contract_number | string | 契約番号 |
47 | date_hw_decomm | string | ハードウェアの使用期限 |
46 | date_hw_expiry | string | ハードウェアメンテナンス終了日 |
45 | date_hw_install | string | ハードウェア設置日 |
44 | date_hw_purchase | string | ハードウェア購入日 |
34 | deployment_status | string | 配布ステータス |
14 | hardware | string | ハードウェア |
15 | hardware_full | string | ハードウェア (詳細) |
39 | host_netmask | string | ホストのサブネットマスク |
38 | host_networks | string | ホストネットワーク |
40 | host_router | string | ホストルータ |
30 | hw_arch | string | ハードウェアアーキテクチャ |
33 | installer_name | string | インストーラ名 |
24 | location | string | 場所 |
25 | location_lat | string | 緯度 |
26 | location_lon | string | 経度 |
12 | macaddress_a | string | MACアドレスA |
13 | macaddress_b | string | MACアドレスB |
29 | model | string | モデル |
3 | name | string | 名前 |
27 | notes | string | 備考 |
41 | oob_ip | string | OOB IPアドレス |
42 | oob_netmask | string | OOBサブネットマスク |
43 | oob_router | string | OOBルータ |
5 | os | string | OS |
6 | os_full | string | OS (詳細) |
7 | os_short | string | OS (簡易説明) |
61 | poc_1_cell | string | プライマリPOCセル |
58 | poc_1_email | string | プライマリPOCメール |
57 | poc_1_name | string | プライマリPOC名 |
63 | poc_1_notes | string | プライマリPOCノート |
59 | poc_1_phone_a | string | プライマリPOC電話番号A |
60 | poc_1_phone_b | string | プライマリPOC電話番号B |
62 | poc_1_screen | string | プライマリPOCスクリーン名 |
68 | poc_2_cell | string | セカンダリPOCセル |
65 | poc_2_email | string | セカンダリPOCメール |
64 | poc_2_name | string | セカンダリPOC名 |
70 | poc_2_notes | string | セカンダリPOCノート |
66 | poc_2_phone_a | string | セカンダリPOC電話番号A |
67 | poc_2_phone_b | string | セカンダリPOC電話番号B |
69 | poc_2_screen | string | セカンダリPOCスクリーン名 |
8 | serialno_a | string | シリアル番号A |
9 | serialno_b | string | シリアル番号B |
48 | site_address_a | string | 住所A |
49 | site_address_b | string | 住所B |
50 | site_address_c | string | 住所C |
51 | site_city | string | 市 |
53 | site_country | string | 国 |
56 | site_notes | string | ノート |
55 | site_rack | string | ラック設置場所 |
52 | site_state | string | 県 |
54 | site_zip | string | 郵便番号 |
16 | software | string | ソフトウェア |
18 | software_app_a | string | ソフトウェアアプリケーションA |
19 | software_app_b | string | ソフトウェアアプリケーションB |
20 | software_app_c | string | ソフトウェアアプリケーションC |
21 | software_app_d | string | ソフトウェアアプリケーションD |
22 | software_app_e | string | ソフトウェアアプリケーションE |
17 | software_full | string | ソフトウェア(詳細) |
10 | tag | string | タグ |
1 | type | string | タイプ |
2 | type_full | string | タイプ(詳細) |
35 | url_a | string | URL A |
36 | url_b | string | URL B |
37 | url_c | string | URL C |
31 | vendor | string | ベンダー |
計70個のパラメーターを登録できます。
そしてホストインベントリで登録できるパラメーターの値はすべてstring型です。
またIDパラメーターはホストインベントリの自動登録でアイテムと紐づけする際に使用されるパラメーターになります。今回は手動で設定するので使用しません。
Pythonで実装する
それでは実際にプログラムを実装します。
ホストの登録時にホストインベントリを登録する
ホストの登録プログラムを土台にして説明します。記事はこちらです。
プログラム
ハイライト部分がホストインベントリ登録の実装です。
最初のホスト登録でホストインベントリのモードが設定されていないため、「inventory_mode」を設定します。
また今回は例としてホストインベントリの「名前」を登録しています。
import os
import traceback
from function import login, logout, invoke
def main():
server = "http://hostname/zabbix"
user = "Admin"
password = "******"
session_id = ""
# ホストインターフェースは「Zabbixエージェント」
interfaces = [
{
"type": 1,
"main": 1,
"useip": 1,
"ip": "192.168.3.1",
"dns": "",
"port": "10050"
}
]
# ホストグループ「Linux servers」に所属
hostgroups = [
{
"groupid": "2"
}
]
# ホストインベントリの「名前」に「Linux Server」を登録
hostinventory = {
"name": "Linux Server"
}
try:
session_id = login(server, user, password)
if 0 < len(session_id):
request = {
"jsonrpc": "2.0",
"method": "host.create",
"params": {
"host": "Linux Server",
"interfaces": interfaces,
"groups": hostgroups,
# 初回の登録のためホストインベントリモードを「手動」に設定
"inventory_mode": 0,
"inventory": hostinventory
},
"auth": session_id,
"id": 1
}
response = {}
if invoke(server, request, response):
print("hostid(s): {}".format(response["result"]["hostids"]))
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()
- invoke(): HTTP(S)でZabbix APIを呼び出す関数
- login(): Zabbix APIを使うにあたり、Zabbix Serverにログインする関数
- logout(): 同、ログアウトする関数
実行結果
PS C:\zabbixapi\sample> python3 .\sample-06.py
hostid(s): ['10381']
ホストインベントリの「名前」に「Linux Server」が入りました!
登録済みのホストにホストインベントリを追加する
実装の土台には、以前の記事で紹介した「ログイン~ログアウト、一連の流れ」を使います。記事はこちらです。
プログラム
次は先ほど登録したホストに対してホストインベントリを追加登録します。
今回は既にホストインベントリのモードが設定されているため、「inventory_mode」は設定しません。
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": "host.update",
"params": {
"hostid": 10381,
# 「inventory_mode」は設定済みのため不要
# 「OS」と「OS(詳細)」を追加で登録
"inventory": {
"os": "Linux",
"os_full": "CentOS Linux release 8.3"
}
},
"auth": session_id,
"id": 1
}
response = {}
if invoke(server, request, response):
print("hostid(s): {}".format(response["result"]["hostids"]))
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()
- invoke(): HTTP(S)でZabbix APIを呼び出す関数
- login(): Zabbix APIを使うにあたり、Zabbix Serverにログインする関数
- logout(): 同、ログアウトする関数
実行結果
PS C:\zabbixapi\sample> python3 .\sample-07.py
hostid(s): ['10381']
先ほど登録したホストに「OS」と「OS(詳細)」のホストインベントリが追加されました!
まとめ
この記事では、Zabbix APIを呼び出してホストインベントリを登録する方法について紹介しました。
ホストインベントリはホストの数が多い場合、1つひとつを手動で設定していては大変です。そこでプログラムで実装し自動化することでホストインベントリの登録が簡単にできるようになります。
ぜひ試してみてください!
次回は「ホストインベントリの削除方法」について紹介したいと思います。
Zabbixに関するお問い合わせはこちらからお願いいたします。