Zabbix API を操作するRubyライブラリ zbxapi を拡張する

ZABBIX

この記事は公開されてから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をプログラムで操作していきましょう。


  1. ホストやホストグループ、テンプレート、トリガなど。詳細はZabbix APIリファレンスに記載されています。