vCener Server Alarm をトリガー時に Slack へ通知したい(vCSA 7.0 + SlackBotで実現する超簡単な障害検知術)

この記事は vExperts Advent Calendar 2021 14日目の記事を兼ねています。

みなさんはホームラボの vSphere 環境を監視してますか?
商用環境と違って、アラート管理とか適当だったりしませんでしょうか。。。
(はい。自分は適当に管理していてアラートに気づかずにホームラボを飛ばした事が何度かあります。。。)

とはいえ、ホームラボで商用環境の様なガチガチな監視環境を構築するのも大変なので、何か手軽に管理出来ないか考えた時、「普段から見てる Slack へ通知すれば良いんじゃないか」と思い立ちました。
今回は、 vCener Server Alarm を Slack チャンネルで受け取る設定について紹介します。

環境

設定対象

操作元

  • Windows 10
  • RLogin 2.26
  • Ubuntu 20.04.2 LTS

準備

1.Slack へコマンドラインからメッセージ送付出来る事を確認する

何はともあれ、 Slack 側でメッセージを受け取る Webhook エンドポイントを発行し、 Ubuntu 上のコマンドラインからメッセージ送付出来る事を確認する

1-1.Slack 上でアラートを受け取るチャンネルを作成する

  1. 「サイドバー」の「チャンネル」右の + をクリックし、 チャンネルを作成する をクリック
    file
  2. 「名前」に適当なチャンネル名、「説明」に適当な説明を入力し、 作成 をクリック
    file
  3. メンバーは後で追加すれば良いので 後でする をクリック
    file

1-2.Slack へメッセージを送付するWebhookエンドポイントを発行する

  1. 作成した チャンネル名 をクリック
    file
  2. ポップアップメニューの インテグレーション をクリックし、 アプリを追加する をクリック
    file
  3. 検索欄に incomming と入力、表示された Incomming Webhooksインストール をクリック
    file
  4. Slackに追加 をクリック
    file
  5. まずIncoming Webhookがメッセージを投稿するチャンネルを選択します。 で作成したチャンネルをプルダウンメニューから選択し、 Incomming Webhook インテグレーションの追加 をクリック
    file
  6. 無事、Webhookエンドポイントが発行されました。(図中赤枠の Webhook URL)
    file

1-3.コマンドラインからメッセージ送付してみてる

  1. サンプルを確認。先ほどWebhookエンドポイントを発行したページの下部にサンプルがあるので確認
    file
  2. サンプルをコピペして実行してみる
    • Ubuntu上のコマンドラインからサンプルを実行してみる
    • 末尾のWebhookエンドポイントのURLは各自環境で発行されたもの
      $ curl -X POST --data-urlencode "payload={\"channel\": \"#alrt_home-test\", \"username\": \"webhookbot\", \"text\": \"これは webhookbot という名のボットから #alrt_home-test に投稿されています。\", \"icon_emoji\": \":ghost:\"}" https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      $ OK
  3. 無事投稿されている事を確認。(図中赤枠の内容がWebhookエンドポイントのURL経由で送付された内容)
    file
  4. タイムラグを確認する(等速GIFアニメ)

    • 気にならないスピードで通知される事を確認

2.vCSA のコマンドラインから Slack へメッセージ送付

Slackで発行したWebhookエンドポイントを用いて、vCSA上のコマンドラインからメッセージ送付出来る事を確認する

2-1.vCSA への SSH ログインを許可する

  1. vCenter Serverへアクセスし、 左上モーダル をクリックし、 管理 をクリック
    file
  2. メニューの システム設定 をクリックし、 表示された vCSA インスタンスの > をクリックしてメニューを展開、展開したメニュー内の「アプライアンス管理」の ログイン をクリック
    file
  3. vCSA 管理のログイン画面が表示されるので設定した vCSA管理「ユーザー名」「パスワード」を入力し、 ログイン をクリック
    file
  4. ログイン後に表示されるメニューから アクセス をクリックして、 編集 をクリック
    file
  5. 「アクセス設定の編集」モーダルが表示されるので、 SSHログインの有効化 トグルを ON に設定し、 OK クリック
    file

2-2.vCSA へ SSH でログインする

  1. vCSA へ設定したIPアドレス(or FQDN)へ SSH で接続する
    • ログイン時のユーザー名が「root」、パスワードは設定した vCSA管理「パスワード」となるので注意
      file
  2. shell と入力して Enter する事で、bashのプロンプトが起動
    Command> shell
    Shell access is granted to root
    root@localhost [ ~ ]# 

2-3.vCSA のコマンドラインからSlackへメッセージを送付してみる

  1. サンプルをコピペして実行してみる
    • vCSA上のコマンドラインからサンプルを実行してみる
    • 末尾のWebhookエンドポイントのURLは各自環境で発行されたもの
      root@localhost [ ~ ]# curl -X POST --data-urlencode "payload={\"channel\": \"#alrt_home-test\", \"username\": \"webhookbot\", \"text\": \"これは vCSA上のコマンドラインから #alrt_home-test に投稿されています。\", \"icon_emoji\": \":ghost:\"}" https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      ok
      root@localhost [ ~ ]#
  2. 無事投稿されている事を確認。(図中赤枠の内容がWebhookエンドポイントのURL経由で送付された内容)
    file

vCenter Alarm のトリガー設定

1.トリガーから利用するスクリプトを用意する

  1. vCSA インスタンスの `/root` 配下(bashログイン時のホームディレクトリ)にスクリプトを設置する
    • `pwd` ホームディレクトリ(カレントディレクトリ)の確認
    • `whereis bash` Bashのバイナリ場所を確認
    • `vi vcenter-alarm.sh` viエディタで `vcenter-alarm.sh` ファイルを作成
    • `ls -lt` カレントディレクトリのファイル実行権限を確認
    • `chmod +x vcenter-alarm.sh` `vcenter-alarm.sh` に実行権限を付与
    • `./vcenter-alarm.sh` 実行権限が付与されたのでそのまま実行
      root@localhost [ ~ ]# pwd
      /root
      root@localhost [ ~ ]# whereis bash
      bash: /usr/bin/bash /usr/lib/bash /etc/bash.bashrc /usr/share/man/man1/bash.1.gz
      root@localhost [ ~ ]# vi vcenter-alarm.sh
      #!/usr/bin/bash
      curl -X POST --data-urlencode "payload={\"channel\": \"#alrt_home-test\", \"username\": \"webhookbot\", \"text\": \"これは vCSA から #alrt_home-test に投稿されています。\", \"icon_emoji\": \":ghost:\"}" https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      root@localhost [ ~ ]# ls -lt
      total 4
      -rw-r--r-- 1 root root 314 Dec 12 06:12 vcenter-alarm.sh
      root@localhost [ ~ ]# chmod +x vcenter-alarm.sh 
      root@localhost [ ~ ]# ls -lt
      total 4
      -rwxr-xr-x 1 root root 314 Dec 12 06:12 vcenter-alarm.sh
      root@localhost [ ~ ]# ./vcenter-alarm.sh 
      ok
      root@localhost [ ~ ]# 

2. トリガーにスクリプトを設定する

  1. vCenter Serverへアクセスし、「ホストおよびクラスタ」ビューから vCenter Server を右クリック、表示されたメニューから `アラーム` をクリックし、 `新しいアラーム定義` をクリック
    file
  2. 「新しいアラーム定義」モーダルの「名前とターゲット」表示されるので、「アラーム名」「説明」を適当に入力。「ターゲットのタイプ」に今回は `仮想マシン` を選択し、 `次へ` をクリック
    file
  3. 「アラーム ルール 1」では、「IF」に `電源と接続状態(19)` から `仮想マシン パワーオフ` を選択
    • テストなので一番確認しやすそうなアラートを使います
      file
  4. 「アラームをトリガーして」を `重大として表示` を選択し、 「スクリプトを実行」のトリガーを `ON` にして、「繰り返し」のチェックボックスも `ON` にし、「このスクリプトを実行」の欄に先ほど作成したスクリプトファイルのパス `/root/vcenter-alarm.sh` を入力し、 `次へ` をクリック
    file
  5. 「ルールのリセット 1」では、特段設定せず `次へ` をクリック
    file
  6. 「確認」でないよ内容を確認して `作成` をクリック
    file

3. トリガーの実行を確認する

  1. 設定したアラームの動作を確認するため、適当な仮想マシンをアクションから電源を `パワーオフ` してみる
    file
    file
  2. vCenter Server上で無事アラームが発行された事を確認(赤枠範囲)
    file
  3. Slack側でもアラーム発行に従って、スクリプトが実行されて、メッセージを受信している事を確認
    file

ここまでで無事 vCenter Server Alarm をトリガー時に Slack で通知を受け取れる様になりました。

各種カスタマイズ

ちょっとメッセージが味気ないのでカスタマイズしてみます

1.Slackでの見た目をカスタマイズ

  1. Slack の Inccoming Webhook カスタマイズ画面の下部で、Botの名前をカスタマイズや、アイコンのカスタマイズをします
    file

2.メッセージ内容をカスタマイズ

  1. vCenter Server Alrmのスクリプトではいろいろな引数や変数が利用出来る

    • 参考ページを見ると沢山の変数や引数が確認出来ます(多分まだvSphere 7.0用ページがないので、6.0用ページから引用しています)
  2. 対象仮想マシン名やアラートの内容が出る様にカスタマイズ

    root@localhost [ ~ ]# vi vcenter-alarm.sh
    #!/usr/bin/bash  
    curl -X POST --data-urlencode "payload={\"channel\": \"#alrt_home-test\", \"text\": \" アラーム名:\t${VMWARE_ALARM_NAME}\n 対象:\t${VMWARE_ALARM_TARGET_NAME}\n\n データセンター名:\t${VMWARE_ALARM_EVENT_DATACENTER}\n クラスター名:\t${VMWARE_ALARM_EVENT_COMPUTERESOURCE}\n ホスト名:\t${VMWARE_ALARM_EVENT_HOST}\n 仮想マシン名:\t${VMWARE_ALARM_EVENT_VM} \" }" https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  3. カスタマイズした結果
    file

最後に

案外簡単に設定出来て、かつ、カスタマイズも容易なので活用出来れば幸いです。
これでホームラボの障害に気づかないまま消失する事故が防げれば良いのですが。。。

参考

表 1. アラーム環境変数

変数名 変数の説明 サポートされるアラーム タイプ
VMWARE_ALARM_NAME 起動されたアラームの名前。 条件、状態、イベント
VMWARE_ALARM_ID 起動されたアラームの MOID。 条件、状態、イベント
VMWARE_ALARM_TARGET_NAME アラームが起動されたエンティティの名前。 条件、状態、イベント
VMWARE_ALARM_TARGET_ID アラームが起動されたエンティティの MOID。 条件、状態、イベント
VMWARE_ALARM_OLDSTATUS アラームの旧ステータス。 条件、状態、イベント
VMWARE_ALARM_NEWSTATUS アラームの新しいステータス。 条件、状態、イベント
VMWARE_ALARM_TRIGGERINGSUMMARY アラームのマルチライン サマリ。 条件、状態、イベント
VMWARE_ALARM_DECLARINGSUMMARY アラーム式の 1 行の宣言。 条件、状態、イベント
VMWARE_ALARM_ALARMVALUE アラームを起動した値。 条件、状態
VMWARE_ALARM_EVENTDESCRIPTION アラームのステータス変更イベントの説明。 条件、状態
VMWARE_ALARM_EVENTDESCRIPTION アラームを起動したイベントの説明。 イベント
VMWARE_ALARM_EVENT_USERNAME イベントに関連付けられたユーザー名。 イベント
VMWARE_ALARM_EVENT_DATACENTER イベントが発生したデータセンターの名前。 イベント
VMWARE_ALARM_EVENT_COMPUTERESOURCE イベントが発生したクラスタまたはリソース プールの名前。 イベント
VMWARE_ALARM_EVENT_HOST イベントが発生したホストの名前。 イベント
VMWARE_ALARM_EVENT_VM イベントが発生した仮想マシンの名前。 イベント
VMWARE_ALARM_EVENT_NETWORK イベントが発生したネットワークの名前。 イベント
VMWARE_ALARM_EVENT_DATASTORE イベントが発生したデータストアの名前。 イベント
VMWARE_ALARM_EVENT_DVS イベントが発生した vSphere Distributed Switch の名前。 イベント

表 1. アラーム アクション スクリプト用のコマンドライン パラメータ

変数 説明
{eventDescription} alarmStatusChange イベントのテキスト。{eventDescription} 変数は、条件および状態アラームでのみサポートされています。
{targetName} アラームが起動されたエンティティの名前。
{alarmName} 起動されたアラームの名前。
{triggeringSummary} アラーム トリガー値の概要情報。
{declaringSummary} アラーム宣言値の概要情報。
{oldStatus} アラームが起動される前のアラーム ステータス。
{newStatus} アラームが起動されたあとのアラーム ステータス。
{target} アラームが設定されたインベントリ オブジェクト。