はじめに
システムの保守業務では、複数のZabbixサーバーを毎日チェックする必要があります。特に、踏み台やVPNを使って環境を切り替えながら確認するのは非常に煩雑です。
このような手間を省くために、Zabbixサーバーの状態を自動的に確認し、その結果をGoogle Chatに通知する方法をご紹介します。これにより、日々の確認作業を効率化できます。
課題
日々のルーチン作業で複数のZabbixサーバーをチェックする際、次のような問題があります。
- 環境切り替えの手間(踏み台やVPNを利用する際の手間)
- 手動での確認作業の煩雑さ
これらの問題を解決するために、Zabbixサーバーで定期的に状態を確認し、Google Chatに自動的に通知するスクリプトを設置することにしました。
Zabbixのレポート機能も利用できますが、環境依存のため、スクリプトでの実現を選びました。
目標
- 現時点での障害アラートの有無を確認する
- その結果を自動的にGoogle Chatに通知する
必要な準備
Zabbixサーバーの情報
● ユーザー名
● パスワード
Google ChatのWebhook URL
Google ChatのWebhook URLを取得します。
このURLを使ってGoogle Chatにメッセージを送信します。
スクリプトの設定手順
Rootユーザーに切り替える
まず、rootユーザーに切り替えます。これにより、システム全体の設定を変更する権限が得られます。
sudo su
スクリプトファイルを作成する
次に、viエディタを使ってPythonスクリプトファイルを作成します。以下のコマンドを実行してください。
vi /etc/zabbix/test_alert_check.py
ファイルが開いたら、iキーを押して編集モードに入り、以下のコードをコピーして貼り付けます。
貼り付けが終わったら、Escキーで編集モードを終了し、:wqと入力してファイルを保存して終了します。
import requests
import json
from datetime import datetime
# Zabbix API設定zabbix_url = ‘ZabbixサーバーURL/api_jsonrpc.php’
zabbix_user = ‘Zabbixユーザー名’
zabbix_password = ‘Zabbixパスワード’
# Google Chat Webhook URLwebhook_url = ‘Google Chat Webhook URL’
# Zabbix APIトークンを取得する関数def get_zabbix_token():
payload = {
‘jsonrpc’: ‘2.0’,
‘method’: ‘user.login’,
‘params’: {
‘user’: zabbix_user,
‘password’: zabbix_password
},
‘id’: 1,
‘auth’: None
}
response = requests.post(zabbix_url, json=payload, verify=False)
return response.json()[‘result’]
# 現在の未解決トリガーを取得する関数def get_current_triggers(token):
payload = {
‘jsonrpc’: ‘2.0’,
‘method’: ‘trigger.get’,
‘params’: {
‘output’: [‘triggerid’, ‘description’, ‘status’, ‘value’],
‘filter’: {
‘value’: 1 # 1はトリガーが問題状態であることを示します
},
‘selectHosts’: [‘host’],
‘sortfield’: ‘description’,
‘sortorder’: ‘ASC’
},
‘auth’: token,
‘id’: 2
}
response = requests.post(zabbix_url, json=payload, verify=False)
return response.json()[‘result’]
# Google Chatにメッセージを送信する関数
def send_to_google_chat(message):
payload = {
‘text’: message
}
response = requests.post(webhook_url, json=payload, verify=False)
return response.status_code
if __name__ == “__main__”:
token = get_zabbix_token()
# 現在の未解決トリガーを取得
triggers = get_current_triggers(token)
if triggers:
trigger_count = len(triggers)
message = f”現在、障害アラートが {trigger_count} 件あります:\n\n”
for trigger in triggers:
message += (f”ホスト: {‘, ‘.join(h[‘host’] for h in trigger.get(‘hosts’, []))}\n”
f”説明: {trigger[‘description’]}\n”
f”状態: {‘障害’ if trigger[‘value’] == ‘1’ else ‘正常’}\n”
f”———————-\n”)
else:
message = “現在、障害アラートはありません。”
status_code = send_to_google_chat(message)
if status_code == 200:
print(“メッセージが正常に送信されました”)
else:
print(“メッセージの送信に失敗しました”)
スクリプトの実行権限を変更する
作成したスクリプトに実行権限を付与します。これにより、スクリプトを実行できるようになります。
chmod +x /etc/zabbix/test_alert_check.py
Cronジョブの設定
スクリプトを定期的に実行するために、Cronジョブを設定します。以下のコマンドでCronジョブの設定を行います。
crontab -e
Cronジョブに次の行を追加し、テストのため、スクリプトが毎日午前11時53分に実行されるようにします:
53 11 * * * /usr/bin/python3 /etc/zabbix/test_alert_check.py
iキーを押して編集モードに入り、Escキーで編集モードを終了し、:wqと入力してファイルを保存して終了します。
確認
スクリプトが正常に動作しているか確認するために、次回の実行時間が来たときにGoogle Chatで通知を確認してください。
障害アラートがある場合、その詳細が通知されるはずです。
この手順で、定期的にZabbixサーバーの状態をGoogle Chatに自動的に通知することができ、監視業務が大幅に効率化されます。