zbxapiを用いて、ZabbixのItemを色んなユーザグループ権限で更新してみた

2015.05.12

サーモン大好き、横山です。
前回、ZabbixのItemの追加が出来たということで、Itemの更新についてどうなのか。
また、ユーザグループの権限によってAPIの結果がどう変わるのかを調べてみました。

準備

前回同様、Amazon Linux 2015.03のt2.microを準備出来ればそれが一番早いと思いますが、
Rubyが動く環境であれば、大丈夫だと思います。

$ ruby --version
ruby 2.0.0p643 (2015-02-25) [x86_64-linux]

$ gem install zbxapi -v 0.3.8
Fetching: zbxapi-0.3.8.gem (100%)
Successfully installed zbxapi-0.3.8
Parsing documentation for zbxapi-0.3.8
Installing ri documentation for zbxapi-0.3.8
Done installing documentation for zbxapi after 0 seconds
1 gem installed

また、Zabbix 2.2を使用しています。

コード

流れと致しまして、
1.Zabbix APIからauthトークンもらう
2.登録するためのItemIDを item.get で取得する()
3.item.update するためのparamを設定する。先ほど取得したItemIDは itemid に設定する。
と、なります。

require 'zbxapi'

zabbix = ZabbixAPI.new('http://zabbix-host/zabbix', :debug => 4)
zabbix.login('user', 'password')

item_ids = zabbix.item.get(filter: {name: 'demo item'})

if item_ids.length > 0 then
  item_id = item_ids.first['itemid']
  item_params = {
    itemid: item_id,
    status: 0
  }

  zabbix.item.update(item_params)
else
  p 'Not Found itemid'
end

item_params 内の status0にすると、GUI上の「ステータス」を有効になり、
1にすると、無効になります。

結果

今回は以下のユーザでそれぞれの挙動を紹介します。
・Zabbixユーザで、ユーザグループ権限が「拒否」テンプレートのアイテムの場合
・Zabbixユーザで、ユーザグループ権限が「読込専用」テンプレートのアイテムの場合
・Zabbixユーザで、ユーザグループ権限が「読書可能」テンプレートのアイテムの場合

Zabbixユーザで、ユーザグループ権限が「拒否」テンプレートのアイテムの場合

zbxapi_update_01

D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:408 Sending: {"jsonrpc":"2.0","method":"user.login","params":{"user":"user","password":"password"},"auth":null,"id":0}
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:410 Response Code: 200
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:411 Response Body: {"jsonrpc":"2.0","result":"69a2e02f668a6e0c5fdcc68824d15a2e","id":0}
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:408 Sending: {"jsonrpc":"2.0","method":"APIInfo.version","params":{},"auth":"69a2e02f668a6e0c5fdcc68824d15a2e","id":1}
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:410 Response Code: 200
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:411 Response Body: {"jsonrpc":"2.0","result":"2.2.9","id":1}
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:408 Sending: {"jsonrpc":"2.0","method":"item.get","params":{"filter":{"name":"demo item"}},"auth":"69a2e02f668a6e0c5fdcc68824d15a2e","id":2}
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:410 Response Code: 200
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:411 Response Body: {"jsonrpc":"2.0","result":[],"id":2}
"Not Found itemid"

結果はテンプレートへのアクセス権限がないので、itemidすら取得出来ません。

Zabbixユーザで、ユーザグループ権限が「読込専用」テンプレートのアイテムの場合

zbxapi_update_02

D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:408 Sending: {"jsonrpc":"2.0","method":"user.login","params":{"user":"user","password":"password"},"auth":null,"id":0}
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:410 Response Code: 200
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:411 Response Body: {"jsonrpc":"2.0","result":"9a8935ea41d0e01ac7d265126634709b","id":0}
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:408 Sending: {"jsonrpc":"2.0","method":"APIInfo.version","params":{},"auth":"9a8935ea41d0e01ac7d265126634709b","id":1}
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:410 Response Code: 200
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:411 Response Body: {"jsonrpc":"2.0","result":"2.2.9","id":1}
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:408 Sending: {"jsonrpc":"2.0","method":"item.get","params":{"filter":{"name":"demo item"}},"auth":"9a8935ea41d0e01ac7d265126634709b","id":2}
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:410 Response Code: 200
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:411 Response Body: {"jsonrpc":"2.0","result":[{"itemid":"24638","value_type":"0","lastclock":"0","lastns":"0","lastvalue":"0","prevvalue":"0"}],"id":2}
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:408 Sending: {"jsonrpc":"2.0","method":"item.update","params":{"itemid":"24638","status":0},"auth":"9a8935ea41d0e01ac7d265126634709b","id":3}
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:410 Response Code: 200
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:411 Response Body: {"jsonrpc":"2.0","error":{"code":-32602,"message":"Invalid params.","data":"No permissions to referred object or it does not exist!"},"id":3}
/home/ec2-user/.gem/ruby/2.0/gems/zbxapi-0.3.8/zbxapi.rb:429:in `do_request': ZbxAPI_ExceptionLoginPermission
	from /home/ec2-user/.gem/ruby/2.0/gems/zbxapi-0.3.8/zbxapi.rb:342:in `api_call'
	from /home/ec2-user/.gem/ruby/2.0/gems/zbxapi-0.3.8/api_classes/api_dsl.rb:275:in `do'
	from /home/ec2-user/.gem/ruby/2.0/gems/zbxapi-0.3.8/api_classes/api_dsl.rb:404:in `block in add'
	from zbx_api3.rb:15:in `<main>'

結果は、itemidの取得は読取権限があるので出来ましたが、
item.updateの段階で、No permissions to referred object or it does not exist!と怒られ更新出来ませんでした。

Zabbixユーザで、ユーザグループ権限が「読書可能」テンプレートのアイテムの場合

zbxapi_update_03

D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:408 Sending: {"jsonrpc":"2.0","method":"user.login","params":{"user":"user","password":"password"},"auth":null,"id":0}
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:410 Response Code: 200
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:411 Response Body: {"jsonrpc":"2.0","result":"b332d8f8d0c18d68e92b1ed1e00391a7","id":0}
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:408 Sending: {"jsonrpc":"2.0","method":"APIInfo.version","params":{},"auth":"b332d8f8d0c18d68e92b1ed1e00391a7","id":1}
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:410 Response Code: 200
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:411 Response Body: {"jsonrpc":"2.0","result":"2.2.9","id":1}
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:408 Sending: {"jsonrpc":"2.0","method":"item.get","params":{"filter":{"name":"demo item"}},"auth":"b332d8f8d0c18d68e92b1ed1e00391a7","id":2}
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:410 Response Code: 200
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:411 Response Body: {"jsonrpc":"2.0","result":[{"itemid":"24638","value_type":"0","lastclock":"0","lastns":"0","lastvalue":"0","prevvalue":"0"}],"id":2}
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:408 Sending: {"jsonrpc":"2.0","method":"item.update","params":{"itemid":"24638","status":0},"auth":"b332d8f8d0c18d68e92b1ed1e00391a7","id":3}
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:410 Response Code: 200
D4 .../zbxapi-0.3.8/zbxapi.rb:do_request:411 Response Body: {"jsonrpc":"2.0","result":{"itemids":["24638"]},"id":3}

結果は、item.updateが成功し、ステータスの更新をが成功しました。
成功すると、itemidsの結果を得る事ができます。

まとめ

Zabbixの管理ユーザでなくても、ユーザグループに「読書権限」のついたテンプレートであればAPIからItemの情報を更新することが出来ました。