zbxapiを用いて、ZabbixのItemを色んなユーザグループ権限で更新してみた
サーモン大好き、横山です。
前回、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 内の status を0にすると、GUI上の「ステータス」を有効になり、
1にすると、無効になります。
結果
今回は以下のユーザでそれぞれの挙動を紹介します。
・Zabbixユーザで、ユーザグループ権限が「拒否」テンプレートのアイテムの場合
・Zabbixユーザで、ユーザグループ権限が「読込専用」テンプレートのアイテムの場合
・Zabbixユーザで、ユーザグループ権限が「読書可能」テンプレートのアイテムの場合
Zabbixユーザで、ユーザグループ権限が「拒否」テンプレートのアイテムの場合
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ユーザで、ユーザグループ権限が「読込専用」テンプレートのアイテムの場合
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ユーザで、ユーザグループ権限が「読書可能」テンプレートのアイテムの場合
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の情報を更新することが出来ました。