Zabbix API を使ってホストを無効化する

会社から自宅の Zabbix に登録されたホストの監視を無効化しました。

自宅にあるファイルサーバーを停止させるにあたって、Zabbix での監視を無効化しておかないと Slack にアラートが飛んできてしまうのでサーバーの停止の前に監視を無効化させます。
みんな大好き curlAPI を呼んでいます。

API の詳細は公式ドキュメントで → 19. API [Zabbix Documentation 3.4]

なお、この方法で無効化した後に「VPN で繋がるならポートフォワーディングでブラウザからフロントエンドにアクセスできんじゃね?」ということに気づいてしまい、設定してみたら繋がっちゃいました、ぐぬぬ

ログインしてアクセスキーを取得する

ログイン情報を環境変数に入れてアクセスキーを取ります。

$ export ZABBIX_URL=%ZabbixフロントエンドのURL%
$ export ZABBIX_USER=%Zabbixユーザー名%
$ export ZABBIX_PASSWD=%Zabbixユーザーのパスワード%

curl にこんな風な JSON を渡します。

{
  "auth":null,
  "method":"user.login",
  "id":1,
  "params":{
    "user":"${ZABBIX_USER}",
    "password":"${ZABBIX_PASSWD}"
  },
  "jsonrpc":"2.0"
}

帰ってくるアクセスキーも環境変数に入れたいので最終的に curl はこんな感じで実行しました。

$ export API_KEY=`curl -k -d "{\"auth\":null,\"method\":\"user.login\",\"id\":1,\"params\":{\"user\":\"${ZABBIX_USER}\",\"password\":\"${ZABBIX_PASSWD}\"},\"jsonrpc\":\"2.0\"}" -H "Content-Type: application/json-rpc" ${ZABBIX_URL}/api_jsonrpc.php | sed -e "s/^.*\"result\":\"\([^\"]*\)\".*$/\1/g"`

こちらを参考にしています→ zabbix-apiにcurlでログインする | CloudAdvisor

ホスト一覧を取得する

ホストに関する APIを見ると host.get でホストの情報を取得して host.update で状態を変更すれば良さそうです。
host.get した時に返ってくるホストの情報は Host object に出ています。内容は英語ですがページ翻訳すればだいたい大丈夫。host.update を見ると host.update で無効化したいホストの ID を添えて対象ホストの status1 にすれば良さそうです。

host.get でホスト一覧を取得して対象ホストの ID を確認します。JSON で返ってくるので適当な名前のファイルに保存しました。
curl にはこんな風な JSON を渡しています。

{
  "auth":"${API_KEY}",
  "method":"host.get",
  "id":2,
  "params":{
    "output":"extend"
  },
  "jsonrpc":"2.0"
}

API を呼びます。

curl -k -d "{\"auth\":\"${API_KEY}\",\"method\":\"host.get\",\"id\":2,\"params\":{\"output\":\"extend\"},\"jsonrpc\":\"2.0\"}" -H "Content-Type: application/json-rpc" ${ZABBIX_URL}/api_jsonrpc.php -o hostlist.json

これでホストの情報が hostlist.json に保存されます。中身を確認して対象のホストの ID を見てやります。

cat hostlist.json | jq "." | less

今回の対象は 10106 でした。この ID を無効化します。

対象のホストを無効化する

今度渡す JSON はこんな

{
  "auth":"${API_KEY}",
  "method":"host.update",
  "id": 3,
  "params":{
    "hostid":"10106",
    "status":1
  },
  "jsonrpc":"2.0"
}
$ curl -k -d "{\"auth\":\"${API_KEY}\",\"method\":\"host.update\",\"id\": 3,\"params\":{\"hostid\":\"10106\",\"status\":1},\"jsonrpc\":\"2.0\"}" -H "Content-Type: application/json-rpc" ${ZABBIX_URL}/api_jsonrpc.php

こんな JSON が返ってくれば OK っぽいです。

{"jsonrpc":"2.0","result":{"hostids":["10106"]},"id":3}

最後にホストのステータスを確認します。
こんな JSON を渡してステータスを確認。

{
  "auth": "${API_KEY}",
  "method": "host.get",
  "params": {
    "filter": {
      "hostid": ["10106"]
    }
  },
  "id": 5,
  "jsonrpc": "2.0"
}
$ curl -k -d "{\"auth\":\"${API_KEY}\",\"method\":\"host.get\",\"params\":{\"filter\":{\"hostid\":[\"10106\"]}},\"id\":4,\"jsonrpc\":\"2.0\"}"  -H "Content-Type: application/json-rpc" ${ZABBIX_URL}/api_jsonrpc.php | jq "." | less

ページャに渡された整形済 JSON を見て status1 になってれば OK です。

最後にログアウトしておきます。

$ curl -k -d "{\"auth\":\"${API_KEY}\",\"method\":\"user.logout\",\"id\":5,\"params\":[],\"jsonrpc\":\"2.0\"}" -H "Content-Type: application/json-rpc" ${ZABBIX_URL}/api_jsonrpc.php

この後監視を無効化したホストの Zabbix-Agent を停止してアラートが飛んでこないか確認して、ホストをシャットダウンしました。