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


[富士通システムズウェブテクノロジー Advent Calendar 2019](https://qiita.com/advent-calendar/2019/fsweb) 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の例**

```yaml
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`コマンドを実行し、コンテナ内に入ります。![docker_command1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537367/fed8b61c-1ab5-a8b0-5adf-443560ccd5ac.jpeg)


コンテナ内で`npm install --save node-ssh`コマンドを実行して、node-sshをインストールします。
![docker_command2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537367/60fc1e3d-05c5-c0e3-475b-b159845ba885.jpeg)

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

   ```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のメインメニューから統合機能を選択します。
統合機能のメニューから内向きのウェブフックを追加します。
![webhook.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537367/2a54a624-a331-9a06-260a-973fceebed60.jpeg)
ウェブフックを編集します。タイトルと説明を入力してください。
　※チャンネルはペイロードで制御するため入力不要です。

### 手順

環境構築のdocker-compose.ymlで指定したポートを入力して、Node-REDに入ります。
　※Node-REDの基本的な使い方に関してはこちらの記事を参考にしました。
　　[Node-RED超入門](https://qiita.com/makaishi2/items/5c7b1b6a72b6938cf3d2)

**Node-REDの画面例**
![Node-RED.main.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537367/254451fc-142e-aec9-c1f1-5b5b858fa598.jpeg)

injectノードでBotを流す日時の設定をします。
![Node-RED.inject.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537367/204f5171-167e-6c41-0c39-adec308c70e4.jpeg)
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の証明書を設定します。
![Node-RED.http.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537367/870031d9-5f4d-2dfa-bfc4-c18f3a3a0497.jpeg)
すべてのノードをつなぎ、右上のデプロイボタンを押下して終了です！
　※debugノードの対象をmsgオブジェクト全体にして動作確認を行いました。

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

### 手順

画面右上のメインメニューから、パレットの管理を選択します。
![Node-RED.palette.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537367/460faae6-5bab-e7c4-6a4c-ef8775b363e5.jpeg)
ノードを追加タブで、mailと入力して検索します。
![Node-RED.mail.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537367/4d94de21-0f4a-ff22-f9d3-296741c7f466.jpeg)
node-red-node-emailを選んでノードを追加し、メール送信ができるようにします。
functionノードに送信したい内容や件名等を書き、ディスク容量確認コマンドを実行するノードとつなげます。

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

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