こちらの投稿は vExperts Advent Calendar 2019 の 10 日目になります。
初挑戦です(`・ω・´)よろしくお願いします。
vSphere Client も Full HTML 5 になったり Project Pacific が発表されてどんどん modern な環境を追及していく vSpehre ですが、vCenter のアラート通知は未だに SNMP or メール通知と中々レガシー…
ここも 今風な感じで Webhook 呼び出して Slack に通知を飛ばしてみる。
1. コマンドの実行
vCenter のアラートアクションに「通知トラップ」の「通知 E メールの送信」に並んで「コマンドの実行」がある。その名の通り、アラートの条件にひっかかった際に任意のコマンドを実行できる。
公式 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 的な何か】
これでアラーム定義から対象アラームのアラームルールでスクリプト実行を指定し、設置したパスを指定する。
この状態でアラートを発生させる。
(試験的にアラート発生させるのはデータストア容量監視の閾値が個人的には楽)
メッセージに埋め込めるパラメータは環境変数に格納されており、↑ の公式 Doc の子ページに使える環境変数が載っているので欲しいメッセージの環境変数を組み合わせて埋め込んでやればOK。
正直 curl 叩いているだけなので個別にスクリプトにせず、スクリプト実行に直接 curl とオプション指定すればいけるかと思ったが、その場合だと何故か環境変数が空でメッセージが組み立てられなかった…なぜ…
2. snmptrapd
vCenter からは SNMP Trap 飛ばして、snmptrapd 側で slack へ POST する方法。
vCenter の設定的には全般設定で適当な 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 的な何か】
これでアラートを起こすと
と、アラートが投稿される。
このままだと何がなにやらなので公式 MIB を入れましょう。
(なんかまだ MIB が足りてないような…)
要望として
大体どこのチャットも Webhook があるので、そろそろ監視通知方法として HTTP 呼び出し辺りを実装してくれませんかねぇ… > VMware さん
一方ロシアは
Slack にメール送信で投稿した。
メールApp は有料プランでないと使えないので試せてないけど、多分コレが一番楽。
(組織によっては App 追加も色々ありそうだけど)