Zabbix API host.update実行時の挙動について整理

Zabbix APIを使ってホスト情報を更新する場合のメソッドについて、改めて整理してみました。
Zabbix APIについてはこの辺りを参照してください。

Zabbix APIには、ホスト情報を管理するためのメソッドが用意されています。

  • host.create
  • host.delete
  • host.exists
  • host.get
  • host.getobjects
  • host.isreadable
  • host.iswritable
  • host.massadd
  • host.massremove
  • host.massupdate
  • host.update

この中のhost.update、host.massadd、host.massupdateの挙動について確認してみました。
特に気になっていたのが、ホストへのテンプレート割り当てを変更したい場合の挙動です。
ホストへのテンプレート割り当て設定を変更することで過去の監視結果データが削除されてしまうのか?、
されずにテンプレート割り当てだけが解除されるのか?などを確認してみました。
以下、3つのケースで試してみました。

ケース1 host.updateを使って割り当てテンプレートを入れ替えた場合

初期状態

ホスト: host1 (hostid : 10332)
割り当てテンプレート: template1 (templateid : 10331)
テンプレートアイテム: item1

この状態のホストに対して、APIでhost.updateを実行し、割り当てテンプレートを変更する
変更後の割り当てテンプレート: template2 (templateid : 10333)
変更後の割り当てテンプレートアイテム: item2

API実行時のパラメータは以下。

"method": "host.update",
"params": {
    "hostid":10332,
    "templates": [
        {"templateid":10333}   ←新たなテンプレートのIDのみを指定
    ]
}
※host.updateはパラメータとして、更新したい内容のみ指定すればOKです。

変更後の状態

ホスト: host1 (hostid : 10332)
割り当てテンプレート: template2 (templateid : 10333)
テンプレートアイテム: item1 , item2

item1はテンプレートアイテムではなく、ホストアイテムに自動変更。
item1のこれまでの監視結果は残ったまま。

ケース2 host.updateを使って割り当てテンプレートを追加した場合

初期状態はケース1と同様。

この状態のホストに対して、APIでhost.updateを実行し、割り当てテンプレートを追加する
追加テンプレート: template2 (templateid : 10333)
追加テンプレートアイテム: item2

API実行時のパラメータは以下。

"method": "host.update",
"params": {
    "hostid":10332,
    "templates": [
        {"templateid":10332},    ←元のテンプレートのIDを指定
        {"templateid":10333}   ←新たに追加するテンプレートのIDを指定
    ]
}

変更後の状態

ホスト: host1 (hostid : 10332)
割り当てテンプレート: template1, template2 (templateid : 10331,10333)
テンプレートアイテム: item1 , item2

item1のこれまでの監視結果は残ったまま。
あらたにitem2の監視が開始した。

ケース3 host.updateを使ってテンプレートを削除し、アイテム自体も削除する場合

ケース2の変更後の状態からtemplate2の割り当てを解除し、アイテム自体も削除する

API実行時のパラメータは以下。

"method": "host.update",
"params": {
    "hostid":10332,
    "templates_clear": [
        {"templateid":10333}    ←削除するtemplate2を指定
    ]
}

変更後の状態

ホスト: host1 (hostid : 10332)
割り当てテンプレート: template1 (templateid : 10331)
テンプレートアイテム: item1

template2の割り当てが解除され、item2のアイテム自体も削除された。
DBに入っているhistoryデータも全て削除された。

結論

host.updateのパラメータとして指定するtemplatesにtemplateidを追加したり、削除したりしても、基本的にこれまでの監視アイテムのデータがなくなることはありません。
host.update時にテンプレートIDを削除するとテンプレートリンクのみを削除したのと同じ状態になります。
テンプレートリンクと監視アイテム割り当て、監視データ全てを削除したい場合は、明示的にtemplates_clearでホスト情報を更新する必要があります。

なお、massaddを利用する場合、テンプレートの追加は追加したいテンプレートIDだけを指定すれば可能です。
ケース2をhost.massaddを使って実現する場合、次のパラメータ指定で実行

"method": "host.massadd",
"params": {
    "hosts":[
        {"hostid":10332}
    ],
    "templates":[
        {"templateid":10333}
    ]
}

massupdateを使う場合、個々のホストに対する処理はhost.updateと同じ挙動になります。
ケース1をhost.massupdateを使って実現する場合、次のパラメータ指定で実行

"method": "host.massupdate",
"params": {
    "hosts":[
        {"hostid":10332}
    ],
    "templates":[
        {"templateid":10333}
    ]
}

これらのメソッドを有効に活用することで益々自動化を促進することができます。