LINEで送る
Pocket

Hai ZabbixマスターになりかけのAdachinです。

今までチャット系ツールはアトラシアンのhipchatを使用していたんですが、
slackに移行するぞ!となったので頑張って連携してみました!

とりあえず、slackはAPIが豊富で、UIもかわいいし、最強チャットツールに任命!
hipchatはよくサポートから落ちてるからゴメンナサイメールが来るのでなんとかしてほしいですね!(´・ω・`)
それ以外はBitbucketとかあるし、どっちでも良さそうですw
とりあえずどうやって連携しているか他のサイト見ても細かく書いていなかったので、
よくわからん人でもこのブログで分かった!となってくれれば幸いでございます。

※追記
zabbix3もzabbix2と基本設定内容は変わりないですが、slackユーザを使ってリモートコマンドを指定しなくてもできます。


■まずはincoming hookを取得

https://my.slack.com/services/new/incoming-webhook

上記のURLをアクセスする前にAlert系のgroupを作ってください。
そしてURLをアクセスしたら使用するgroupを選択し、Your Unique Webhook URLをメモします。
こんなやつ。

https://hooks.slack.com/services/HAHA/WHOHO/HEHEHE

slackでの作業はオシマイです。


■Zabbixサーバにてスクリプトファイルの設置

ZabbixのAlertScriptPathを/etc/zabbix/zabbix_server.confから確認します。

これでOKです。


■Zabbixの設定

・メディアタイプの設定

管理 -> メディアタイプ -> メディアタイプの作成
下記の画像のように登録してください。

z01

・slackユーザ作成

管理 -> ユーザ -> ユーザの作成

名前 Slack
メディア -> 新規メディア >#Alertchannel名
タイプ Slack
グループ Zabbix Administrator

・メディアタイプの設定(zabbix3)

管理>メディアタイプ

・アクションの設定

設定 -> アクション -> アクションの作成

下記のように設定してください。
リカバリメッセージ チェックオン(zabbix3の方を参考に)

・zabbix2

z02

・zabbix3

・アクションの実行条件(zabbix2,3)

z03

トリガーの値に障害と正常を追加します。
アクションの実行内容はターゲットリストをリストを現在のホストに、コマンドは下記のようにします。
テストしたい場合は下記のコマンドを打って確認してください。

・zabbix2(アクションの実行内容)

z004

・zabbix3(アクションの実行内容)

※ユーザに送信でも可能です。

・その他

※PROBLEMを繰り返し通知させたい場合はアクションを2つに分ける必要があります。
problem→0(無限) 、recovery→1(一回のみ)のように設定します。


■slack.shについて

デフォルトのスクリプトだとかなり使いにくいし、見にくいので実行するとこんな感じで出ると思います。

z05

改行もしたいし、色も付けたいし、Downの場合は絵文字で見やすくしたり、自分なりに工夫して作ってみました。
基本webシナリオのものをslackに通知させてます。
で、こんな感じにしました。
よかったら参考にしてください!

#!/bin/bash
# Slack sub-domain name (without '.slack.com'), user name, and the channel to send the message to
channel='#hoge'
username='Zabbix'
# Get the Slack incoming web-hook token ($1) and Zabbix subject ($2 – hopefully either PROBLEM or RECOVERY)
token="https://hooks.slack.com/services/xxxxxxxxxxxxxxxxxxxxx"
strSubject="$2"
# Extract status & severity from subject:
# * status [OK|PROBLEM]
# * severity [Not classified|Information|Warning|Average|High|Disaster]
arrSubject=(${strSubject/// })
status=${arrSubject[0]}
severity=${arrSubject[1]}
# Change message emoji depending on the status – smile (RECOVERY), frowning (PROBLEM), or ghost (for everything else)
emoji=':zabbix:'
color='#FFFFFF'
if [ ! -z "$status" ]; then
if [[ $status == 'CRITICAL' ]] || [[ $status == 'critical' ]]; then
emoji=':tired_face:'
color="#FF1D00";
title=${status}
elif [[ $status == 'WARNING' ]] || [[ $status == 'warning' ]]; then
emoji=':anguished:'
color="#FFFF00";
title=${status}
elif [[ $status == 'UNKNOWN' ]] || [[ $status == 'unknown' ]]; then
emoji=':thinking_face:'
color="#8C8C8C";
title=${status}
elif [[ $status == 'OK' ]] || [[ $status == 'ok' ]]; then
emoji=':laughing:'
color="#0BDA51";
title=${status}
elif [[ $status == 'RECOVERY' ]] || [[ $status == 'recovery' ]]; then
emoji=':relieved:'
color="#0BDA51";
title=${status}
elif [[ $status == 'DOWN' ]] || [[ $status == 'down' ]]; then
emoji=':scream:'
color="#FF1D00";
title=${status}
elif [[ $status == 'PROBLEM' ]] || [[ $status == 'problem' ]]; then
emoji=':fearful:'
color="#FF1D00";
title=${status}
elif [[ $status == 'UP' ]] || [[ $status == 'up' ]]; then
emoji=':flushed:'
color="#439FE0";
title=${status}
fi
fi
# Prepare attachment payload so that we can customize
# how Slack will display allert
attachment="
{
\"title\":\"${title}\",
\"fallback\":\"*${title}*\n$3\",
\"text\":\"$3\",
\"color\":\"${color}\",
\"mrkdwn_in\": [\"text\", \"title\", \"fallback\"]
}"
# Build our JSON payload and send it as a POST request to the Slack incoming web-hook URL
payload="payload={\"channel\": \"${channel}\", \"username\": \"${username}\", \"icon_emoji\": \"${emoji}\", \"attachments\":[${attachment}]}"
/usr/bin/curl -m 5 –data-urlencode "${payload}" 'https://hooks.slack.com/services/xxxxxxxxxxxxxxxxxxxx'
# zabbix command
/usr/lib/zabbix/alertscripts/slack.sh '#channel' "{TRIGGER.STATUS}-{HOSTNAME}" "{TRIGGER.NAME}-{ITEM.VALUE1}"

view raw
zabbix2_slack.sh
hosted with ❤ by GitHub

#!/bin/bash
# Slack sub-domain name (without '.slack.com'), user name, and the channel to send the message to
channel='#channel'
username='zabbix'
# Get the Slack incoming web-hook token ($1) and Zabbix subject ($2 – hopefully either PROBLEM or RECOVERY)
token="https://hooks.slack.com/services/xxxxxxxxxxxxxxxxxxxxxxx"
strSubject="$2"
# Extract status & severity from subject:
# * status [OK|PROBLEM]
# * severity [Not classified|Information|Warning|Average|High|Disaster]
arrSubject=(${strSubject/// })
status=${arrSubject[0]}
severity=${arrSubject[1]}
# Change message emoji depending on the status – smile (RECOVERY), frowning (PROBLEM), or ghost (for everything else)
emoji=':zabbix:'
color='#FFFFFF'
recoversub='^RECOVER(Y|ED)?$'
if [[ "$strSubject" =~ ${recoversub} ]]; then
title=${status}
elif [ "$strSubject" == 'PROBLEM' ]; then
color="#FF1D00";
title=${status}:scream:
else
color="#0BDA51";
title=${status}:laughing::+1:
fi
# Prepare attachment payload so that we can customize
# how Slack will display allert
attachment="
{
\"title\":\"${title}\",
\"fallback\":\"*${title}*\n$3\",
\"text\":\"$3\",
\"color\":\"${color}\",
\"mrkdwn_in\": [\"text\", \"title\", \"fallback\"]
}"
# Build our JSON payload and send it as a POST request to the Slack incoming web-hook URL
payload="payload={\"channel\": \"${channel}\", \"username\": \"${username}\", \"icon_emoji\": \"${emoji}\", \"attachments\":[${attachment}]}"
/usr/bin/curl -m 5 –data-urlencode "${payload}" 'https://hooks.slack.com/services/xxxxxxxxxxxxxxxxxxxxx'

view raw
zabbix3_slack.sh
hosted with ❤ by GitHub

・zabbix2(slack)

slackres・zabbix3(slack)


■まとめ

時間があったらこのスクリプトをいろいろ改良したいですね。
ロアベ上がったらグラフをslackに通知とかなどなど。。
redmineもslackに通知などなど。。
次回はslackでnagios通知をブログします。

参考:https://github.com/ericoc/zabbix-slack-alertscript

LINEで送る
Pocket

カテゴリー: BlogslackZabbix

adachin

1989年生まれのLancers SRE。 ホスティングから大規模なアドテクなどのインフラエンジニアとして携わり、AnsibleやTerraformでのインフラコード化を推進。副業では数社サーバー保守なども実施している。また、「脆弱性スキャナVuls」のOSS活動もしており、自称エバンジェリスト/技術広報/テクニカルサポート/コントリビュータでもある。現在はサービスの信頼性向上、可用性、レイテンシ、パフォーマンス、モニタリング、緊急対応、インフラコード化、リファクタリング、セキュリティ強化、新技術の検証、Docker開発環境の提供、AWSでのインフラ構築、グループ会社のインフラをECS/Fargateへ移行、CakePHP4での管理画面作成、メンター、分析基盤の運用を担当している。

0件のコメント

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください