読者です 読者をやめる 読者になる 読者になる

Zabbix API で Shell からメンテナンスを操作する

デプロイ時に nginx を再起動するなど,Zabbix の監視トリガーに該当するオペレーションを実行する場合,無駄にアラートが鳴ってしまう場合がある.正しくは Zabbix のメンテナンスを作成することで,メトリクスを収集しながら監視トリガーに該当しないようにする必要があって,今回 Shell から Zabbix API を叩いて実現した.

main.sh

create_maintenancedelete_maintenance を使ってメンテナンスを操作する.メンテナンスの作成時に含めるホスト名を指定する.

#!/bin/sh

. ./zabbix_utils.sh

create_maintenance 'deploy_maintenance' 'web001'

# deploying...

delete_maintenance 'deploy_maintenance'

zabbix_utils.sh

JSON のパースをするのに jq を使っている.

#!/bin/sh
#
# Zabbix を操作する関数をまとめたユーティリティスクリプト

URL='xxx'
BASIC_AUTH='xxx'
ZABBIX_USER='xxx'
ZABBIX_PASSWORD='xxx'

#######################################
# トークンを取得する
# https://www.zabbix.com/documentation/2.0/manual/appendix/api/user/login
# Returns:
#   TOKEN
#######################################
create_token() {
  PARAMS=$(cat << EOS
      {
          "jsonrpc": "2.0",
          "method": "user.login",
          "params": {
              "user": "${ZABBIX_USER}",
              "password": "${ZABBIX_PASSWORD}"
          },
          "id": 1
      }
EOS
  )

  curl -s -H 'Content-Type:application/json-rpc' \
       --user ${BASIC_AUTH} ${URL} \
       -d "${PARAMS}" | /usr/local/bin/jq -r '.result'
}

#######################################
# ホスト情報から hostid を取得する
# https://www.zabbix.com/documentation/2.0/manual/appendix/api/host/get
# Arguments:
#   $1 HOST NAME
# Returns:
#   ZABBIX HOST ID
#######################################
get_host_id() {
  PARAMS=$(cat << EOS
      {
          "jsonrpc": "2.0",
          "method": "host.get",
          "params": {
              "output": [
                  "hostid"
              ],
              "filter": {
                  "name": [
                      "$1"
                  ]
              }
          },
          "id": 1,
          "auth": "${TOKEN}"
      }
EOS
  )

  curl -s -H 'Content-Type:application/json-rpc' \
       --user ${BASIC_AUTH} ${URL} \
       -d "${PARAMS}" | /usr/local/bin/jq -r '.result[].hostid'
}

#######################################
# メンテナンス情報から maintenanceid を取得する
# https://www.zabbix.com/documentation/2.0/manual/appendix/api/maintenance/get
# Arguments:
#   $1 ZABBIX MAINTENANCE NAME
# Returns:
#   ZABBIX MAINTENANCE ID
#######################################
get_maintenance_id() {
  PARAMS=$(cat << EOS
      {
          "jsonrpc": "2.0",
          "method": "maintenance.get",
          "params": {
              "output": [
                  "maintenanceid"
              ],
              "filter": {
                  "name": [
                      "$1"
                  ]
              }
          },
          "id": 1,
          "auth": "${TOKEN}"
      }
EOS
  )

  curl -s -H 'Content-Type:application/json-rpc' \
       --user ${BASIC_AUTH} ${URL} \
       -d "${PARAMS}" | /usr/local/bin/jq -r '.result[].maintenanceid'
}

#######################################
# メンテナンスを作成する
# 「開始日時」と「終了日時」は「実行時から1日間」とする(デフォルト)
# 「メンテナンスタイプ」は「データ収集あり」とする(デフォルト)
# 「期間」は「実行時から1日間」で「一度限り」とする
# https://www.zabbix.com/documentation/2.0/manual/appendix/api/maintenance/create
# Arguments:
#   $1 ZABBIX MAINTENANCE NAME
#   $2 HOST NAME
#######################################
create_maintenance() {
  PARAMS=$(cat << EOS
      {
          "jsonrpc": "2.0",
          "method": "maintenance.create",
          "params": {
            "name": "$1",
            "hostids": [
                "$(get_host_id $2)"
            ],
            "timeperiods": [
                {
                    "period": 86400
                }
            ]
          },
          "id": 1,
          "auth": "${TOKEN}"
      }
EOS
  )

  curl -s -H 'Content-Type:application/json-rpc' \
       --user ${BASIC_AUTH} ${URL} \
       -d "${PARAMS}" | /usr/local/bin/jq .
}

#######################################
# メンテナンスを削除する
# https://www.zabbix.com/documentation/2.0/manual/appendix/api/maintenance/delete
# Arguments:
#   $1 ZABBIX MAINTENANCE NAME
#######################################
delete_maintenance() {
  PARAMS=$(cat << EOS
      {
          "jsonrpc": "2.0",
          "method": "maintenance.delete",
          "params": [
              $(get_maintenance_id $1)
          ],
          "id": 1,
          "auth": "${TOKEN}"
      }
EOS
  )

  curl -s -H 'Content-Type:application/json-rpc' \
       --user ${BASIC_AUTH} ${URL} \
       -d "${PARAMS}" | /usr/local/bin/jq .
}

#######################################
# メイン
# スクリプトのインポート時に実行する
#######################################
TOKEN=$(create_token)

デプロイ改善

最近 Shell で書かれてるデプロイを改善してて,Zabbix API を叩く以外には AWS CLI を使って ELB を操作したりしている.ただこれ以上複雑になるとシェル芸も厳しくなってくるので Capistrano などを検討しようと思っている.

kakakakakku.hatenablog.com

Zabbix API 雑感

前に Shell と Ruby で試してみたけど,今回は実際に運用で使ってみた.基本的に全てのオペレーションが API で実現できて,自動化に適しているなと感じている.ただ JSON-RPC で定義されてるメソッドとパラメータが多いため,Ruby などのラッパーライブラリを使う場合は,必要なメソッドとパラメータが実装されてるかを確認する必要があると思う.JSON-RPC はシンプルな仕様なこともあって,無理にラッパーライブラリを使う必要はないかもしれないなと感じた.引き続き使っていく気持ち!

kakakakakku.hatenablog.com