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 を停止してアラートが飛んでこないか確認して、ホストをシャットダウンしました。