Mattermostに仮想サーバのディスク空き容量お知らせBotを作る


富士通システムズウェブテクノロジー Advent Calendar 2019 11日目の投稿です。
(お約束)記事の内容は全て個人の見解であり、執筆内容は執筆者自身の責任です。所属する組織は関係ありません。
また、執筆者はSE一年目の新人のため、至らない点があればご指摘いただけると嬉しいです。

初めに

仮想サーバのディスク容量って気が付いたらいっぱいになっていませんか?コマンドがTabキーで補完されなくなってから気づくと対応が面倒ですよね。
そこで、仮想サーバのディスク容量を指定した日時にチャットツールに通知するBotを作成しました。

  • 前提条件

    • 仮想サーバはエクストラネット環境
    • ローカルはWindows10
    • 使用OSSはDocker,Node-RED
    • Mattermostのチーム管理者かシステム管理者になる

環境構築

まずは環境構築です。Docker上にNode-REDをインストールして、Node.jsを使えるように設定します。

手順

以下のURLからWindows10にDockers for Windowsをインストールします。
https://docs.docker.com/docker-for-windows/install/

docker-compose設定ファイルのdocker-compose.ymlを作成します。

docker-compose.ymlの例

version: '2'
services:
  nodered:
    ports:
      - 8088:1880
    volumes:
      - C:/xxx/Node-RED/nodered-data-pj:/data
    environment:
      - TZ=Asia/Tokyo
      - NODE_RED_ENABLE_PROJECTS=true
    image:
      nodered/node-red:latest
    restart: unless-stopped

Windows PowerShellを管理者として実行します。

docker-compose.ymlのあるフォルダ上でdocker-compose up -dを実行し、バックグラウンドでコンテナを立ち上げます。

docker exec -it node-red_nodered_1 bashコマンドを実行し、コンテナ内に入ります。

コンテナ内でnpm install --save node-sshコマンドを実行して、node-sshをインストールします。

Node-REDの追加モジュールを利用するために、settings.jsを編集します。
settings.jsの編集例

   functionGlobalContext: {
   sensor:require('node-ssh')
   // os:require('os'),
   // jfive:require("johnny-five"),
   // j5board:require("johnny-five").Board({repl:false})
   },

exitコマンドを実行し、コンテナから出ます。

docker-compose restartコマンドでアプリケーションを再起動します。

Mattermostにディスク容量を通知するBot作成

Bot作成をします。前提としてチーム管理者かシステム管理者でないとウェブフックを追加できないため、権限のある人に依頼しましょう。

事前準備

Mattermostのメインメニューから統合機能を選択します。
統合機能のメニューから内向きのウェブフックを追加します。

ウェブフックを編集します。タイトルと説明を入力してください。
 ※チャンネルはペイロードで制御するため入力不要です。

手順

環境構築のdocker-compose.ymlで指定したポートを入力して、Node-REDに入ります。
 ※Node-REDの基本的な使い方に関してはこちらの記事を参考にしました。
  Node-RED超入門

Node-REDの画面例

injectノードでBotを流す日時の設定をします。

functionノードに、仮想サーバ内にSSH接続してディスク容量確認コマンドを実行するコードを書きます。

node.js

async function main() {

    const node_ssh = global.get("sensor");
    const ssh = new node_ssh();

    const sshPassword = '********';

    // 接続
    await ssh.connect({
        host: 'XXX.XX.XX.XX',
        port: 22,
        username: '****',
        password: sshPassword
    });

    // コマンド実行
    msg.ssh = await ssh.execCommand('df -H', {options: {pty: true}});

    // 切断
    ssh.dispose();
    node.send(msg);
}

main();

functionノードに、MattermostにBotとしてメッセージを流すコードを書きます。

node.js
msg.payload = {};
msg.payload.icon_url = 
"https://xxxxxxxx/xxxxxxxxxxxx";
msg.payload.username = "ディスク空き容量お知らせ";
msg.payload.text = "@xxx.xxx\n```\n"+msg.ssh.stdout+"\n```";
msg.payload.channel = "xxxx"
msg.url = "https://mattermost.xxx/hooks/xxxxxxxxxxxxxxxxxxxx";

return msg;

 ※msg.payload.textの@XXX.XXXはメンションです。
http requestノードの、SSL/TLS接続を有効化チェックボックスにチェックを入れ、Mattermostの証明書を設定します。

すべてのノードをつなぎ、右上のデプロイボタンを押下して終了です!
 ※debugノードの対象をmsgオブジェクト全体にして動作確認を行いました。

Botと同じ内容をメールにも送る方法

Botと同じ内容をメールで送る方法についての説明です。

手順

画面右上のメインメニューから、パレットの管理を選択します。

ノードを追加タブで、mailと入力して検索します。

node-red-node-emailを選んでノードを追加し、メール送信ができるようにします。
functionノードに送信したい内容や件名等を書き、ディスク容量確認コマンドを実行するノードとつなげます。

node.js
msg.payload = msg.ssh.stdout;
msg.topic = "【Node-RED】ディスク空き容量お知らせ";

return msg;

接続部が左側にあるemailノードを選び、宛先、サーバ、ポートなどを入力し、ディスク容量確認コマンドを実行するノードとつなげます。
デプロイして終了!設定した日時にメールが届きます。