vHoge

VMwareのアレコレ備忘録。CLIでがんばるネタ多め。

vCenter アラートを今風に通知する

こちらの投稿は vExperts Advent Calendar 2019 の 10 日目になります。
初挑戦です(`・ω・´)よろしくお願いします。

adventar.org

vSphere Client も Full HTML 5 になったり Project Pacific が発表されてどんどん modern な環境を追及していく vSpehre ですが、vCenter のアラート通知は未だに SNMP or メール通知と中々レガシー…
ここも 今風な感じで Webhook 呼び出して Slack に通知を飛ばしてみる。

1. コマンドの実行

vCenter のアラートアクションに「通知トラップ」の「通知 E メールの送信」に並んで「コマンドの実行」がある。その名の通り、アラートの条件にひっかかった際に任意のコマンドを実行できる。

docs.vmware.com

公式 Doc を読む限りだと Windows 版 vCenter の例になっているが、vCSA でも使える。 なので、例えば vCSA に SSH でログインして以下を仕込む。

root@vcsa01 [ ~ ]# cat /usr/local/bin/alert.sh
#!/bin/sh
/usr/bin/curl -X POST --data-urlencode "payload={\"text\": \"${VMWARE_ALARM_NAME}\n${VMWARE_ALARM_TARGET_NAME}\n${VMWARE_ALARM_EVENTDESCRIPTION}\n${VMWARE_ALARM_ALARMVALUE} \"}" https://hooks.slack.com/services/【Token 的な何か】

これでアラーム定義から対象アラームのアラームルールでスクリプト実行を指定し、設置したパスを指定する。 スクリプト仕込み この状態でアラートを発生させる。
(試験的にアラート発生させるのはデータストア容量監視の閾値が個人的には楽) slack
メッセージに埋め込めるパラメータは環境変数に格納されており、↑ の公式 Doc の子ページに使える環境変数が載っているので欲しいメッセージの環境変数を組み合わせて埋め込んでやればOK。

正直 curl 叩いているだけなので個別にスクリプトにせず、スクリプト実行に直接 curl とオプション指定すればいけるかと思ったが、その場合だと何故か環境変数が空でメッセージが組み立てられなかった…なぜ…

2. snmptrapd

vCenter からは SNMP Trap 飛ばして、snmptrapd 側で slack へ POST する方法。
vCenter の設定的には全般設定で適当な SNMP レシーバを指定してアラートアクションに通知トラップを指定してやる。 SNMPレシーバ あとは SNMP レシーバ側で snmptrapd と curlスクリプトを仕込む。

# snmptrapd インストールは apt-get なり yum なりで
$ cat /etc/snmp/snmptrapd.conf
authCommunity log,execute,net public
traphandle default /usr/local/bin/alert2.sh

snmptrapd から呼び出すスクリプトが結構クセがあり、snmp メッセージを引数でなく標準入力で渡してくるので読み込みに一手間。さらに snmp メッセージがダブルクォートを含んでいるのでシェル → json 用に多重でエスケープが必要だったりでかなり面倒…

$ cat /usr/local/bin/alert2.sh
#!/bin/sh
while read line;
do
    text="$text$line\n"
done
text=`echo $text | sed s/\"/\\\\\\\\\"/g`

/usr/bin/curl -X POST \
        --data-urlencode "payload={\"text\": \"$text\"}" \
        https://hooks.slack.com/services/【Token 的な何か】

これでアラートを起こすと SNMPアラート と、アラートが投稿される。
このままだと何がなにやらなので公式 MIB を入れましょう。

kb.vmware.com

SNMPアラート with MIB (なんかまだ MIB が足りてないような…)

要望として

大体どこのチャットも Webhook があるので、そろそろ監視通知方法として HTTP 呼び出し辺りを実装してくれませんかねぇ… > VMware さん

一方ロシアは

Slack にメール送信で投稿した。

メールApp は有料プランでないと使えないので試せてないけど、多分コレが一番楽。
(組織によっては App 追加も色々ありそうだけど)