Zabbix API を使ってホストを無効化する
会社から自宅の Zabbix に登録されたホストの監視を無効化しました。
自宅にあるファイルサーバーを停止させるにあたって、Zabbix での監視を無効化しておかないと Slack にアラートが飛んできてしまうのでサーバーの停止の前に監視を無効化させます。
みんな大好き curl で API を呼んでいます。
API の詳細は公式ドキュメントで → 19. API [Zabbix Documentation 3.4]
なお、この方法で無効化した後に「VPN で繋がるならポートフォワーディングでブラウザからフロントエンドにアクセスできんじゃね?」ということに気づいてしまい、設定してみたら繋がっちゃいました、ぐぬぬ。
ログインしてアクセスキーを取得する
ログイン情報を環境変数に入れてアクセスキーを取ります。
$ export ZABBIX_URL=%ZabbixフロントエンドのURL% $ export ZABBIX_USER=%Zabbixユーザー名% $ export ZABBIX_PASSWD=%Zabbixユーザーのパスワード%
{ "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 を添えて対象ホストの status
を 1
にすれば良さそうです。
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 を見て status
が 1
になってれば 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 を停止してアラートが飛んでこないか確認して、ホストをシャットダウンしました。