Contents
Zabbixで監視を自動化したりしているのですが、マップも監視対象が追加された時点で自動的に作成できれば便利だなと思ったのでZabbix API経由からマップを作成する手順について簡単にですがまとめてみます。
環境
サーバ情報
| 項目 | 内容・バージョン |
|---|---|
| OS | CentOS 7.4 |
| Zabbix | 3.0.13-2 |
開発情報
| 項目 | 内容・バージョン |
|---|---|
| Python | 3.4.4 |
Zabbix Map APIドキュメント
https://www.zabbix.com/documentation/3.0/manual/api/reference/map
テンプレート
今回は、以下のテンプレートを元に処理を書いていきます。
以下からは # ここから処理を書いていく 以降を書いていきます。
マップ自動生成をやってみた
マップ作成編
まずは、シンプルなマップを作ってみます。
|
1 2 3 4 5 6 7 8 9 |
# ここから処理を書いていく # Create Map. params = {} params['name'] = "Map" params['width'] = 600 params['height'] = 600 r = zapi.post('map.create', params) print(json.dumps(json.loads(r), indent=2)) |
| パラメーター | 説明 |
|---|---|
| name | マップの名前 |
| width | マップ幅のサイズ |
| height | マップ高さのサイズ |
実行します。
以下はレスポンスボディです。
|
1 2 3 4 5 6 7 8 9 10 |
{ "jsonrpc": "2.0", "result": { "sysmapids": [ "12" ] }, "id": 1 } |
マップが作成されているか確認します。

マップ作成と同時にアイコンを追加
マップ作成と作成したマップにアイコンを追加する処理を一度にやってみようと思います。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# ここから処理を書いていく # Element. element = {} element['elementid'] = 10105 element['selementid'] = 1 element['elementtype'] = 0 element['iconid_off'] = 101 # Create Map. params = {} params['name'] = "Map" params['width'] = 600 params['height'] = 600 params['selements'] = [element] r = zapi.post('map.create', params) print(json.dumps(json.loads(r), indent=2)) |
| パラメーター | 説明 |
|---|---|
| elementid | エレメント(アイコン)に紐づけるID(ホストやグループ) |
| selementid | マップ内で判別するエレメントのID、これを元にエレメント同士を紐付けたりします |
| elementtype | マップエレメントのタイプ、エレメントはhostなのかmapなのかなど |
| iconid_off | アイコンの種類 |
| selements | エレメントを配列で渡す |
注意点としては、アイコンに紐づけるホストなどがZabbixに登録されている必要があります。
elementid は省略できません。
ここでは example01 というホストを手動で登録してURLから hostid を取得しています。
~~決して自動で取得する処理を書くのがめんどくさかった訳では…~~
ただし elementtype が 4(イメージ) の場合は elementid が実在していないものでも登録出来ちゃいます。
実行するとMapにアイコンが出来ています。
|
1 2 3 4 5 6 7 8 9 10 |
{ "jsonrpc": "2.0", "id": 1, "result": { "sysmapids": [ "13" ] } } |

アイコンの種類について
参考までに iconid_off の情報については以下に保存してあります。
imageid を iconid_off に指定します。
https://gist.github.com/sky-joker/727f319e0f0601f2b08004de05ce0f17
ちなみに取得の仕方は以下のようにします。
|
1 2 3 4 5 6 |
# ここから処理を書いていく params = {} params['output'] = ["imageid", "name"] r = zapi.get('image.get', params) print(json.dumps(json.loads(r), indent=2)) |
アイコンの座標を指定する
座標を指定しない場合は、全てのアイコンは画面左上に出来てしまうので座標を指定してみます。
|
1 2 3 4 5 6 7 8 9 10 11 |
# ここから処理を書いていく # Element. element = {} element['elementid'] = 10105 element['selementid'] = 1 element['elementtype'] = 0 element['iconid_off'] = 101 element['x'] = 100 element['y'] = 100 (snip) |
| パラメーター | 説明 |
|---|---|
| x | アイコンのx座標を指定します |
| y | アイコンのy座標を指定します |
実行するとアイコンが指定した座標に配置されています。
|
1 2 3 4 5 6 7 8 9 10 |
{ "jsonrpc": "2.0", "result": { "sysmapids": [ "14" ] }, "id": 1 } |

アイコンを紐づけてみる
マップにアイコンを2つ登録してお互いを紐づけてみます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# ここから処理を書いていく # Element1. element1 = {} element1['elementid'] = 10105 element1['selementid'] = 1 element1['elementtype'] = 0 element1['iconid_off'] = 101 element1['x'] = 100 element1['y'] = 100 # Element2. element2 = {} element2['elementid'] = 10106 element2['selementid'] = 2 element2['elementtype'] = 0 element2['iconid_off'] = 101 element2['x'] = 350 element2['y'] = 100 # Element Link. elementLink = { 'selementid1': element1['selementid'], 'selementid2': element2['selementid'] } # Create Map. params = {} params['name'] = "Map" params['width'] = 600 params['height'] = 600 params['selements'] = [element1, element2] params['links'] = [elementLink] r = zapi.post('map.create', params) print(json.dumps(json.loads(r), indent=2)) |
| パラメーター | 説明 |
|---|---|
| links | 紐づけたいエレメントの selementid を渡します |
実行するとアイコンが2つ出来て紐づけられています。
|
1 2 3 4 5 6 7 8 9 10 |
{ "id": 1, "jsonrpc": "2.0", "result": { "sysmapids": [ "16" ] } } |

マップをアップデートする
既に作成したマップをアップデート(アイコンを追加したり)してみます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# ここから処理を書いていく # Element1. element1 = {} element1['elementid'] = 10105 element1['selementid'] = 1 element1['elementtype'] = 0 element1['iconid_off'] = 101 element1['x'] = 100 element1['y'] = 100 # Element2. element2 = {} element2['elementid'] = 10106 element2['selementid'] = 2 element2['elementtype'] = 0 element2['iconid_off'] = 101 element2['x'] = 350 element2['y'] = 100 # Element Link. elementLink = { 'selementid1': element1['selementid'], 'selementid2': element2['selementid'] } # Update Map. params = {} params['sysmapid'] = 18 params['selements'] = [element1, element2] params['links'] = [elementLink] r = zapi.post('map.update', params) print(json.dumps(json.loads(r), indent=2)) |
| パラメーター | 説明 |
|---|---|
| sysmapid | アップデート対象のsysmapid |
作成時と違うのは、対象の sysmapid を指定します。
sysmapidはマップのURLとか作成時のレスポンスボディから確認できます。
独り言
今回は、シンプルな処理しかしなかったから多次元連想配列(multi_dimension_dict)は使わなかった。。。