この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
こんにちは、川原です。
最近、Zabbix を API 経由で操作することが多いです。
その際、Zabbix APIを直に操作するのではなく、Ruby の Zabbix API 操作ライブラリの zbxapi 経由で操作しているのですが、以外と簡単に操作できてこれは便利です。
zbxapi を使ったZabbix API操作については以下のぶろぐ記事も参考になります。
ただ、このライブラリ、全てのZabbixAPIには対応しておらず、操作できないAPIがあります。
今回、ライブラリを拡張し、デフォルトでは操作できないAPIを操作できるようにしてみたので紹介します。
前提
実行環境は以下です。
ruby: 2.0.0p481 (2014-05-08 revision 45883) [universal.x86_64-darwin14]
zbxapi: 0.3.10
接続先Zabbix:Zabbix 3.0.0alpha2
やってみた
まず、以下のようなZabbixに登録してあるスクリプトを取得するRubyプログラム(zabbix_test.rb)を作成してみます。
APIアクセス先のFQDN名とか、アカウントID、パスワードは適切に置き換えてください。
require 'zbxapi'
require 'pp'
zabbix = ZabbixAPI.new('http://YOURHOSTNAME.com/zabbix')
zabbix.login('YOUR_ACCOUNT_ID', 'PASSWORD')
pp scripts = zabbix.script.get()
で、実行してみます。
>ruby ~/bin/zabbix_test.rb
/Users/kawahara.kunio/bin/zabbix_test.rb:7:in `<main>': undefined method `script' for #<ZabbixAPI:0x007fadfb0337b0> (NoMethodError)
上記の通り、NoMethodError
が発生してしまいます。
これは、zbxapi ライブラリにZabbixのscriptを操作するメソッドが存在していないためです(エラー名の通り)。
存在しないなら作成してしまおう、ということなのですが、zbxapi では非常に簡単に追加できます。
以下の通り、先ほどのスクリプトに都合4行ほど追加して実行してみましょう。
require 'zbxapi'
require 'pp'
# ここから 追加
require "api_classes/api_dsl"
class Script < ZabbixAPI_Base
actions :get, :create, :update, :delete
end
# ここまで 追加
zabbix = ZabbixAPI.new('http://YOURHOSTNAME.com/zabbix')
zabbix.login('YOUR_ACCOUNT_ID', 'PASSWORD')
pp scripts = zabbix.script.get()
実行結果は下記の通り。エラーは発生せず、結果は pp
メソッドで整形されて出力されています。
>ruby ~/bin/zabbix_test.rb
[{"scriptid"=>"47",
"name"=>"テスト用スクリプト",
"command"=>
"/home/ec2-user/test_script.rb",
"host_access"=>"2",
"usrgrpid"=>"52",
"groupid"=>"113",
"description"=>"",
"confirmation"=>"テスト用確認メッセージ",
"type"=>"0",
"execute_on"=>"1"},
〜〜省略〜〜
補足
zbxapiにおいて、ユーザーが使用する各クラスは以下の通り、gemのapi_classes
ディレクトリ配下にあります。
>ls -l /Library/Ruby/Gems/2.0.0/gems/zbxapi-0.3.10/api_classes/
total 224
-rw-r--r-- 1 root wheel 14K 11 14 14:16 api_dsl.rb
-rw-r--r-- 1 root wheel 1.0K 11 14 14:16 dsl_action.rb
-rw-r--r-- 1 root wheel 1.0K 11 14 14:16 dsl_alert.rb
-rw-r--r-- 1 root wheel 1.0K 11 14 14:16 dsl_configuration.rb
-rw-r--r-- 1 root wheel 1.0K 11 14 14:16 dsl_dcheck.rb
-rw-r--r-- 1 root wheel 1.0K 11 14 14:16 dsl_dhost.rb
-rw-r--r-- 1 root wheel 1.1K 11 14 14:16 dsl_drule.rb
-rw-r--r-- 1 root wheel 1.0K 11 14 14:16 dsl_dservice.rb
-rw-r--r-- 1 root wheel 1.2K 11 14 14:16 dsl_event.rb
-rw-r--r-- 1 root wheel 1.2K 11 14 14:16 dsl_graph.rb
-rw-r--r-- 1 root wheel 1.2K 11 14 14:16 dsl_history.rb
-rw-r--r-- 1 root wheel 6.1K 11 14 14:16 dsl_host.rb
-rw-r--r-- 1 root wheel 1.3K 11 14 14:16 dsl_hostgroup.rb
-rw-r--r-- 1 root wheel 1.1K 11 14 14:16 dsl_hostinterface.rb
-rw-r--r-- 1 root wheel 1.2K 11 14 14:16 dsl_item.rb
-rw-r--r-- 1 root wheel 1.1K 11 14 14:16 dsl_maintenance.rb
-rw-r--r-- 1 root wheel 1.2K 11 14 14:16 dsl_mediatype.rb
-rw-r--r-- 1 root wheel 1.2K 11 14 14:16 dsl_proxy.rb
-rw-r--r-- 1 root wheel 1.3K 11 14 14:16 dsl_template.rb
-rw-r--r-- 1 root wheel 3.5K 11 14 14:16 dsl_trigger.rb
-rw-r--r-- 1 root wheel 1.3K 11 14 14:16 dsl_user.rb
-rw-r--r-- 1 root wheel 1.3K 11 14 14:16 dsl_usergroup.rb
-rw-r--r-- 1 root wheel 1.3K 11 14 14:16 dsl_usermacro.rb
-rw-r--r-- 1 root wheel 1.2K 11 14 14:16 dsl_usermedia.rb
ファイル名から想像できる通り、dsl_XXXX.rb
の各ファイルはZabbixの要素1を操作するためのクラスに対応します。
ここに存在するファイルに対応する要素については、デフォルトで操作できます。存在しない要素については、今回のように対応する操作クラスを追加する必要があります。
ホストを操作するHost
クラスについて、一部を抜粋で表示します。
>cat /Library/Ruby/Gems/2.0.0/gems/zbxapi-0.3.10/api_classes/dsl_host.rb
〜〜省略〜〜
class Host < ZabbixAPI_Base
action :get do
#arg_processor "1.3" do |params|
# params["output"]="extend"
# params
#end
parameters "1.3",
"nodeids","groupids","hostids","templateids","itemids","triggerids",
"graphids","proxyids","maintenanceids","dhostids","dserviceids",
"monitored_hosts","templated_hosts","proxy_hosts","with_items",
"with_monitored_items","with_historical_items","with_triggers",
"with_monitored_triggers","with_httptests",
"with_monitored_httptests","with_graphs","editable","filter",
"search","startSearch","excludeSearch","searchWildcardsEnabled",
"output","select_groups","selectParentTemplates","select_items",
"select_triggers","select_graphs","select_applications",
"selectInterfaces","select_macros","select_profile","countOutput",
"groupOutput","preservekeys","sortfield","sortorder","limit",
"extendoutput"
〜〜省略〜〜
各クラスには、要素に対する操作(アクション)とそのパラメータが記載されています。パラメータについては、定義しなくても動作するようです(今回試しに追加したScript
クラスにはアクションだけを定義しています)。
恐らく、API呼び出し時に指定されたパラメータをチェックに追加するのだと思います。
まとめ
いかがでしたでしょうか?
zbxapiライブラリは簡単に拡張できますね。
もし、ライブラリ側でクラスやメソッドが不足していた場合は、必要なものを自分で追加して、Zabbixをプログラムで操作していきましょう。
- ホストやホストグループ、テンプレート、トリガなど。詳細はZabbix APIリファレンスに記載されています。 ↩