Zabbix API を Bash と Ruby で試した

最近 Zabbix の設定を精査したり,ロール別にスクリーンを作って可視化を徹底している中で,Zabbix の操作全般を自動化してもっと効率良く作業をしたいなと感じていた.実は今まで使ったことがなかった Zabbix API を検証してみたので,メモを残しておこうと思う.今回は Bash と Ruby で apiinfo.versionhost.get の値を取得した.感想として,やっぱりシェル芸はツライし,運用では Ruby を使うと思う.

ドキュメントなど

ドキュメントを読むときは Zabbix のバージョンを意識する.今回はシステムの都合で 2.0 としている.

「一番優れている」と豪語しててワロタw

Zabbixの全ての機能の中で一番優れている機能がAPIで、Zabbixが持つほとんど全ての機能にアクセスすることができます。

Zabbix API with Bash : hello_zabbixapi.sh

以下の項目は伏せている.

  • ${BASIC_AUTH} ... Basic Auth User & Password
  • ${URL} ... Zabbix URL
  • ${ZABBIX_USER} ... Zabbix User
  • ${ZABBIX_PASSWORD} ... Zabbix Password
#!/bin/sh

# トークンを取得する

PARAMS=$(cat << EOS
    {
        "jsonrpc": "2.0",
        "method": "user.login",
        "params": {
            "user": "${ZABBIX_USER}",
            "password": "${ZABBIX_PASSWORD}"
        },
        "id": 1
    }
EOS
)

TOKEN=$(
  curl -s -H 'Content-Type:application/json-rpc' \
    --user ${BASIC_AUTH} ${URL} \
    -d "${PARAMS}" | jq -r '.result'
)

PARAMS=$(cat << EOS
    {
        "jsonrpc": "2.0",
        "method": "apiinfo.version",
        "id": 2,
        "auth": "${TOKEN}"
    }
EOS
)

# Zabbix API Version を取得する
# https://www.zabbix.com/documentation/2.0/manual/appendix/api/apiinfo/version
curl -s -H 'Content-Type:application/json-rpc' \
    --user ${BASIC_AUTH} ${URL} \
  -d "${PARAMS}" | jq .

PARAMS=$(cat << EOS
    {
        "jsonrpc": "2.0",
        "method": "host.get",
        "params": {
            "output": [
                "hostid",
                "host"
            ],
            "selectInterfaces": [
                "interfaceid",
                "ip"
            ]
        },
        "id": 2,
        "auth": "${TOKEN}"
    }
EOS
)

# ホスト情報を取得する
# https://www.zabbix.com/documentation/2.0/manual/appendix/api/host/get
curl -s -H 'Content-Type:application/json-rpc' \
    --user ${BASIC_AUTH} ${URL} \
  -d "${PARAMS}" | jq .

Zabbix API with Bash : 実行結果

動いた!(ホスト一覧はサンプル)

{
  "jsonrpc": "2.0",
  "result": "2.0.6",
  "id": 2
}
{
  "jsonrpc": "2.0",
  "result": [
    {
      "interfaces": {
        "1": {
          "interfaceid": "1",
          "ip": "127.0.0.1",
          "hostid": "10084"
        }
      },
      "hostid": "10084",
      "host": "Zabbix server"
    },
    {
      "interfaces": {
        "3": {
          "interfaceid": "3",
          "ip": "xxx.xxx.xxx.xxx",
          "hostid": "10086"
        }
      },
      "hostid": "10086",
      "host": "yyy"
    },
  ],
  "id": 2
}

Zabbix API with Ruby : hello_zabbixapi.rb

今回は Zabbix API 関連の Gem で一番メンテされてる感じがする zabbixapi を使うことにした.README にも書いてあるけど,Zabbix API Version によって Gem のバージョンを変える必要があるので注意すること.今回は 2.0.0 指定で bundle install している.

github.com

以下の項目は伏せている.

  • ${BASIC_AUTH_USER} ... Basic Auth User
  • ${BASIC_AUTH_PASSWORD} ... Basic Auth Password
  • ${URL} ... Zabbix URL
  • ${ZABBIX_USER} ... Zabbix User
  • ${ZABBIX_PASSWORD} ... Zabbix Password
source 'https://rubygems.org'

gem 'zabbixapi', '2.0.0'
gem 'pry'
require 'zabbixapi'
require 'pry'
require 'pp'

zbx = ZabbixApi.connect(
  url: '${URL}',
  user: '${ZABBIX_USER}',
  password: '${ZABBIX_PASSWORD}',
  http_user: '${BASIC_AUTH_USER}',
  http_password: '${BASIC_AUTH_PASSWORD}'
)

# Zabbix API Version を取得する
# https://www.zabbix.com/documentation/2.0/manual/appendix/api/apiinfo/version
pp zbx.query(
  method: 'apiinfo.version'
)

# ホスト情報を取得する
# https://www.zabbix.com/documentation/2.0/manual/appendix/api/host/get
pp zbx.query(
  method: 'host.get',
  params: {
    output: [
      'hostid',
      'host'
    ],
    selectInterfaces: [
      'interfaceid',
      'ip'
    ]
  }
)

Zabbix API with Ruby : 実行結果

動いた!(ホスト一覧はサンプル)

"2.0.6"
[{"interfaces"=>
   {"1"=>{"interfaceid"=>"1", "ip"=>"127.0.0.1", "hostid"=>"10084"}},
  "hostid"=>"10084",
  "host"=>"Zabbix server"},
 {"interfaces"=>
   {"3"=>{"interfaceid"=>"3", "ip"=>"xxx.xxx.xxx.xxx", "hostid"=>"10086"}},
  "hostid"=>"10086",
  "host"=>"yyy"}]

自動化に価値を置く

Kaizen Platform の採用ページに書いてある以下のスローガンが本当に好きで意識するようにしてる.今はスタートアップなフェーズだからスピード優先な場面が多いし,今までも手動で作業してきたとは思うけど,中長期的なスケールを考えて自動化に価値を置きたいし,自動化に価値があることを積極的に伝えていくことが僕の仕事なんじゃないかと思ってる.

「3度同じ事を繰り返す時は自動化する」がモットーです。

kaizenplatform.com

まとめ

今回は Zabbix API を軽く試してみた.Chef と連携したり,Capistrano と連携したりして,今までの作業を効率化しようと思う.もし Mackerel や Datadog を導入するとしても,Zabbix と併用すると思うし,Zabbix とは長い付き合いになりそうだー!