Nagiosのアラートから一斉に携帯電話にコールして、対応のすべてを記録していく方法


システム運用の監視ツールとしてNagiosを利用しているケースが多いかと思います。Nagiosは監視方法の種類から、監視間隔や通知間隔など柔軟性、カスタマイズ性が高い非常に便利なツールです。

ただし、そのサーバやリソースに問題が発生した際の通知方法は基本メール。外出中や席を外してるとき、会議中も気付けないケースが多々あります。
そして、検知したあとも連絡や対応内容が、口頭だったりチャットだったり共有していないかったり情報が散漫します。

それを解決するために、自社の障害対応管理ツール「Reactio」というサービスを利用して電話での一斉通知とチャットでの対応する方法を共有します。

## 概要

* Nagiosの設定
	* インストールと初期設定
	* イベントハンドラスクリプトを作成
	* イベントハンドラのコマンドを定義
	* 監視サービスにイベントハンドラを設定
* Reactioの設定
	* プロジェクトのAPIキーの登録
	* API-Clientのインストール
	* インシデント作成プログラムの作成
* まとめ
	* 電話で一斉通知は対応速度が向上する。
	* Reactio連携する監視サービスと閾値には注意


## Nagiosの設定

Nagosとは？
サーバやネットワーク監視のためのオープンソースソフトウェア。

![Screen Shot 2015-08-04 at 6.56.12 PM.png](https://qiita-image-store.s3.amazonaws.com/0/9416/cdab2537-95c7-f3ee-0eda-bcee8637af1d.png)
https://www.nagios.com/products/nagios-core/

### インストールと初期設定

すでに導入済みに方がご覧になると思いますので、インストールと初期設定は割愛します。下記のようなブログを参考にしてください。
http://easyramble.com/install-and-setup-nagios.html

### イベントハンドラスクリプトを作成

Nagiosには、アラート発生時と同時に外部コマンドを実行するイベントハンドラという機能があります。これを利用することによって、Reactioのインシデント作成APIを実行することができます。
イベントハンドラスクリプトはシェルで簡単に作成できます。
参考） https://assets.nagios.com/downloads/nagioscore/docs/nagioscore/3/en/eventhandlers.html

当方が作成したスクリプト

```shell:create-incident
#!/bin/sh

case "$1" in
CRITICAL)
        case "$2" in
        HARD)
                echo -n "Create Incident of Reactio..."
                /usr/bin/perl /usr/local/nagios/libexec/reactio/create-incident.pl $4 $1
                ;;
        esac
        ;;
DOWN)
        case "$2" in
        HARD)
                echo -n "Create Incident of Reactio..."
                /usr/bin/perl /usr/local/nagios/libexec/reactio/create-incident.pl $4 $1
                ;;
        esac
        ;;
esac
exit 0
```

このスクリプトをnagiosユーザで実行できるディレクトリに設置します。

### イベントハンドラのコマンドを定義

作成したイベントハンドラをNagiosの監視設定で指定できるようにコマンドとして定義します。定義する際に、マクロというアラートに関連する値を渡すことができます。
参考） 

* 今回利用するマクロ
	* $SERVICESTATE$ （サービスの現在の状態を文字列）
	* $SERVICESTATETYPE$ （サービスチェックにおけるステートタイプを文字列）
	* $SERVICEATTEMPT$ （チェックのリトライ回数）
	* $HOSTNAME$ （対象ホストの名前）

当方が設定したコマンドの定義

``` conf:commands.cfg
define command{
        command_name create-incident-service
        command_line /usr/local/nagios/libexec/eventhandlers/create-incident $SERVICESTATE$ $SERVICESTATETYPE$ $SERVICEATTEMPT$ $HOSTNAME$
        }
```

### 監視サービスにイベントハンドラを設定

Nagiosの監視設定内でイベントハンドラを実行するために、「event_handler」を追記します。ここで定義したコマンドを指定します。

当方が設定した内容

```conf:test.cfg
define service{
        use                     local-service
        host_name               reactio-alert-test
        service_description     PING
        check_command           check_ping!100.0,20%!500.0,60%
        event_handler           create-incident-service
        }
```

以上でNagios側の準備は完了です。リロードして設定を反映しましょう。

``` bash
/etc/init.d/nagios reload
Running configuration check...done.
Reloading nagios configuration...done
```

## Reactioの設定

ここで自社サービスの[「Reactio」](https://reactio.jp/)を設定していきます。30日間無料でお試しできるので、気軽に試してみてください。
![Screen Shot 2015-08-04 at 6.55.22 PM.png](https://qiita-image-store.s3.amazonaws.com/0/9416/4f913a46-7d80-e569-992c-04627cc76fc7.png)
「Reactio製品サイト」： https://reactio.jp/

### プロジェクトのAPIキーの登録

Reactioには、各種APIとWebhookが提供されています。今回はAPIの「インシデント作成」を利用します。APIを利用するためには、Reactioの管理者で登録したプロジェクトごとにAPIキーを作成する必要があり、下記のブログ記事を参考に設定してみてください。

参考） http://blog.reactio.jp/entry/2015/05/26/161408


### API-Clientのインストール

Reactioの開発メンバーがさくっと作ってくれたAPI-Clientを利用すれば、手軽にインシデント作成APIを実行するプログラムを作ることができます。
インストールと簡単な利用方法はReactioのブログに掲載してますので割愛します。

* perlの場合
	* WebService::Reactio  https://metacpan.org/pod/WebService::Reactio
	* ブログ： http://blog.reactio.jp/entry/2015/07/30/154737
* Rubyの場合
	* gem::Reactio  https://rubygems.org/gems/reactio
	* ブログ： http://blog.reactio.jp/entry/2015/05/13/172036

### インシデント作成プログラムの作成

準備が整ったところで、イベントハンドラスクリプトから実行されるインシデント作成プログラムを作りましょう。（※ORGANIZATION IDは、Reactioのサブドメインです。）

当方が作成したプログラム

``` perl:create-incident.pl
use utf8;
use strict;
use warnings;
use WebService::Reactio;

my $client = WebService::Reactio->new(
    api_key      => '<API KEY>',
    organization => '<ORGANIZATION ID>',
);

my $option_pram = {
        detection =>'system',
        notification_text => "$ARGV[0] $ARGV[1] が発生。至急確認と対応をお願い致します。",
        notification_call => 1,
        };

my $created = $client->create_incident("$ARGV[0] $ARGV[1] 障害が発生",$option_pram);
```

これで、完了！
あとは、実際にテストでアラートを発生させて、動作確認をしてみましょう。

## まとめ

### 電話で一斉通知は対応速度が向上する。

最近のモバイル事情は、スマホにインストールしたアプリのPush通知などいろいろな通知が「ブルブル」鳴るしFacebookやLINEなど気軽にメッセージがたくさんくるので、メールの通知なんかは埋もれてしまって気づけないことが多いです。（※私感）

だからこそ、電話での通知なら必ず気づけるので非常に助かります。




### Reactio連携する監視サービスと閾値には注意

Nagiosではひとつのサーバに対して複数のリソースを監視しているし、アラートの状態が続くと再通知もされるので、なんでもかんでもReactio連携するとインシデントが氾濫してしまいます。なので、本当に気付きたいアラートのみにしておくべきでしょう。

## その他

* 注意

	この記事は、テスト実装レベルの内容なので実際に本番で運用する際には、対象の環境に合わせてカスタマイズし充分な検証の上でご導入ください。