デプロイ時に nginx を再起動するなど,Zabbix の監視トリガーに該当するオペレーションを実行する場合,無駄にアラートが鳴ってしまう場合がある.正しくは Zabbix のメンテナンスを作成することで,メトリクスを収集しながら監視トリガーに該当しないようにする必要があって,今回 Shell から Zabbix API を叩いて実現した.
main.sh
create_maintenance
と delete_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 などを検討しようと思っている.
Zabbix API 雑感
前に Shell と Ruby で試してみたけど,今回は実際に運用で使ってみた.基本的に全てのオペレーションが API で実現できて,自動化に適しているなと感じている.ただ JSON-RPC で定義されてるメソッドとパラメータが多いため,Ruby などのラッパーライブラリを使う場合は,必要なメソッドとパラメータが実装されてるかを確認する必要があると思う.JSON-RPC はシンプルな仕様なこともあって,無理にラッパーライブラリを使う必要はないかもしれないなと感じた.引き続き使っていく気持ち!