Sensuのchef/puppetを使わないセットアップ

# ドキュメントはこちら
http://sensuapp.org/docs/0.16/
必要なことはだいたい書いてあります。
ドキュメントにもChef/Puppetを利用してインストールするのが最善だと書かれています。
Chef/Puppetを使うと、各コンポーネントを理解せぬまま使うことになりかねない(私はchefもpuppetもやらないので、完全に言い訳ですけどね。)ので、ここでは手動でのセットアップを記載しておきます。もっとも、手動セットアップもドキュメントに書いてありますけどね。

この記事では、ドキュメントのInstallationを主に説明します。

# 必要なコンポーネント
* RabbitMQ
* Redis
* Sensu server
* Sensu client
* Sensu API
* Uchiwa (Sensu GUI)

一応僕のお勧めは、理解するまでは、上記を別々のサーバに入れて確認することです。dockerとかで分離でも良いと思います。別々に入れることで、どのコンポーネントがどのコンポーネントに接続する必要があるのか、と言った部分の理解が進むでしょう。
僕が最初に入れた時は、1台に全部入れたのですが、どれがどの設定なのやら、とても分かりづらかったです。
しかし、最近になって気がついたんですが、ドキュメントのFAQに全部書いてありました。う〜む。
http://sensuapp.org/docs/0.16/faq

そういえば、sensuの起動スクリプトはCentOS7のsystemdに対応していません。CentOS6で構築した方が良いです。
以下はすべてCentOS 6.6です。

# 各コンポーネントのインストール

## SSL certificates
http://sensuapp.org/docs/0.16/certificates
これは、RabbitMQとsensu-server,sensu-clientをSSL接続する際の証明書になります。

```
cd /tmp
wget http://sensuapp.org/docs/0.16/tools/ssl_certs.tar
tar -xvf ssl_certs.tar
cd ssl_certs
./ssl_certs.sh generate
```

## RabbitMQ
http://sensuapp.org/docs/0.16/rabbitmq
RabbitMQはsensu-serverとsensu-clientが接続します。
RabbitMQはErlangで動いているので、Erlangのインストールが必要です。
Erlangについては、R16B01以降でないとsslv3(poodle attackくらう可能性あり)を無効に出来ないバグがあるらしくR16B01以降をインストールしたいところなんですが、epelにあるのはR14Bです。今回はローカル環境なんで、手抜きでR14Bでセットアップします。
本当に使うのであれば、R16B01以降を入れましょう。
http://www.rabbitmq.com/install-debian.html
上記に記載がありますが、[Erlang Solutions repository](https://www.erlang-solutions.com/downloads/download-erlang-otp)から入れればよいかと。(試してないが。)

```
# yum -y install epel-release
# yum -y install http://www.rabbitmq.com/releases/rabbitmq-server/v3.4.3/rabbitmq-server-3.4.3-1.noarch.rpm
```

### RabbitMQのSSLの設定
SSL certificatesで作った証明書をコピーしましょう。必要なの下記です。`/tmp/ssl_certs`の下にあるはず。

* sensu_ca/cacert.pem
* server/cert.pem
* server/key.pem

これを`/etc/rabbitmq/ssl`にコピーします。

```
# mkdir /etc/rabbitmq/ssl
# cd /etc/rabbitmq/ssl
# cp /tmp/ssl_certs/sensu_ca/cacert.pem .
# cp /tmp/ssl_certs/server/cert.pem .
# cp /tmp/ssl_certs/server/key.pem .
```

RabbitMQの設定は次の通り。

```/etc/rabbitmq/rabbitmq.config
[
    {rabbit, [
    {ssl_listeners, [5671]},
    {ssl_allow_poodle_attack, true},
    {ssl_options, [{cacertfile,"/etc/rabbitmq/ssl/cacert.pem"},
                   {certfile,"/etc/rabbitmq/ssl/cert.pem"},
                   {keyfile,"/etc/rabbitmq/ssl/key.pem"},
                   {verify,verify_peer},
                   {fail_if_no_peer_cert,true}]}
  ]}
].
```

R14B01でSSLする場合は、`{ssl_allow_poodle_attack, true}`が必要です。この設定を入れないとR14B01ではSSLを有効にしてRabbitMQを起動できません。poodle attackを受け入れることになるので、ご注意ください。

```
# chkconfig rabbitmq-server on
# service rabbitmq-server start
```

### vhostの設定
RabbitMQへsensu用のvhostを設定します。

```
# rabbitmqctl add_vhost /sensu
```

### userの作成
RabbitMQへsensuがアクセスするためのユーザを作成します。

```
# rabbitmqctl add_user sensu SUBSTITUTE_ME
# rabbitmqctl set_permissions -p /sensu sensu ".*" ".*" ".*"
```

### RabbitMQ web management consoleの設定
Web GUIでRabbitMQを管理できるようになります。オプションですが、入れておきましょう。

```
# rabbitmq-plugins enable rabbitmq_management
```


## redis
http://sensuapp.org/docs/0.16/redis
Redisはsensu-serverとsensu-apiが接続します。
Redisは、とりあえずインストールするだけでOK。

```
# yum -y install epel-release
# yum -y install redis

# chkconfig redis on
# service redis start
```

なお、redisを別に立てる(sensu-server,sensu-apiと同居させるのであれば、不要です。)場合は、redis.confのbindの設定を変更して外部からアクセスできるように設定する必要があります。

```/etc/redis.conf
# If you want you can bind a single interface, if the bind option is not
# specified all the interfaces will listen for incoming connections.
#
#bind 127.0.0.1

bindをコメントアウトします。
```

## Sensu packages
http://sensuapp.org/docs/0.16/packages
sensu本体です。sensuはserverとclientとapiがひとつのパッケージになっています。また、起動に必要なrubyもまるっと一緒に入っています。(“omnibus” packages)
sensu自体もyumで入れるだけでOK。

repoファイルは自分で作ります。

```/etc/yum.repos.d/sensu.repo
[sensu]
name=sensu-main
baseurl=http://repos.sensuapp.org/yum/el/$releasever/$basearch/
gpgcheck=0
enabled=1
```

```
# yum -y install sensu
```

## Uchiwa (sensu GUI)
http://sensuapp.org/docs/0.16/dashboards_uchiwa
Uchiwaはsensu-apiを利用したsensuのWeb GUIです。
これも、yumで一発インストールです。

```/etc/yum.repos.d/sensu.repo
[sensu]
name=sensu-main
baseurl=http://repos.sensuapp.org/yum/el/$releasever/$basearch/
gpgcheck=0
enabled=1
```

```
# yum -y install uchiwa
```

# sensu-server, sensu-client, sensu-apiの設定

## RabbitMQへの接続設定
http://sensuapp.org/docs/0.16/guide
RabbitMQへはsensu-server,sensu-client,sensu-apiが接続しますので、それぞれに設定が必要です。
RabbitMQへはSSL接続しますので、SSL certificatesで作った証明書のコピーが必要です。
必要なの下記です。`/tmp/ssl_certs`の下にあるはず。

* client/cert.pem
* client/key.pem

これを`/etc/sensu/ssl/`にコピーします。

```
# mkdir /etc/sensu/ssl
# cd /etc/sensu/ssl
# cp /tmp/ssl_certs/client/cert.pem .
# cp /tmp/ssl_certs/client/key.pem .
```

sensu-server,sensu-client.sensu-api用のRabbitMQの設定は次のとおりです。

```/etc/sensu/conf.d/rabbitmq.json
{
  "rabbitmq": {
    "ssl": {
      "cert_chain_file": "/etc/sensu/ssl/cert.pem",
      "private_key_file": "/etc/sensu/ssl/key.pem"
    },
    "host": "SUBSTITUTE_ME",
    "port": 5671,
    "vhost": "/sensu",
    "user": "sensu",
    "password": "SUBSTITUTE_ME"
  }
}

passwordへはRabbitMQのセットアップをした際に指定したパスワードを指定します。
hostはRabbitMQの接続先のホスト情報です。localhostとかそんなの。
```

## Redisへの接続設定
http://sensuapp.org/docs/0.16/guide
Redisへはsensu-server,sensu-apiが接続しますので、それぞれに設定が必要です。

```/etc/sensu/conf.d/redis.json
{
  "redis": {
    "host": "SUBSTITUTE_ME",
    "port": 6379
  }
}

hostはRabbitMQの接続先のホスト情報です。localhostとかそんなの。
```

## Sensu APIの設定
http://sensuapp.org/docs/0.16/guide
Sensu-APIの設定です。

```/etc/sensu/conf.d/api.json
{
  "api": {
    "port": 4567,
    "user": "admin",
    "password": "SUBSTITUTE_ME"
  }
}

ここで指定したuserとpasswordでSensu API Serverへアクセスすることになります。
```

## RabbitMQ, Redis, Sensu APIの設定は`/etc/sensu/config.json`へ
今までの説明では、RabbitMQ, Redis, Sensu APIの設定を`/etc/sensu/conf.d`配下へ配置しましたが、`/etc/sensu/config.json`へまとめて記載した方が良いのではないかと思っています。`/etc/sensu/config.json`へはsensu自体の設定を記載し、`/etc/sensu/conf.d`配下へは実際の監視設定を記載する方が分かりやすいのではないかと思っています。好みの問題かもしれませんが。

まとめて書くと、次のような感じになります。

```/etc/sensu/config.json
{
  "rabbitmq": {
    "ssl": {
      "cert_chain_file": "/etc/sensu/ssl/cert.pem",
      "private_key_file": "/etc/sensu/ssl/key.pem"
    },
    "host": "localhost",
    "port": 5671,
    "vhost": "/sensu",
    "user": "sensu",
    "password": "secret"
  },
  "redis": {
    "host": "localhost",
    "port": 6379
  },
  "api": {
    "host": "localhost",
    "port": 4567,
    "user": "admin",
    "password": "secret"
  }
}
```

## Sensu Clinetの設定
http://sensuapp.org/docs/0.16/guide
http://sensuapp.org/docs/0.16/clients
Sensu CLientは以下に加えて、RabbitMQへのアクセス設定も必要になります。
ここでは、sensu-server自身をsensu-clientとして登録しましょう。

```/etc/sensu/conf.d/client.json
{
  "client": {
    "name": "Sensu Server",
    "address": "SUBSTITUTE_ME",
    "subscriptions": [ "all" ]
  }
}

addressにはsensu-serverのIP Addressを記載します。
```

## Uchiwaの設定
http://sensuapp.org/docs/0.16/dashboards_uchiwa
Uchiwaはsensu-apiへアクセスします。

```/etc/sensu/uchiwa.json
{
    "sensu": [
        {
            "name": "Sensu",
            "host": "SUBSTITUTE_ME",
            "ssl": false,
            "port": 4567,
            "user": "SUBSTITUTE_ME",
            "pass": "SUBSTITUTE_ME",
            "path": "",
            "timeout": 5000
        }
    ],
    "uchiwa": {
        "user": "",
        "pass": "",
        "port": 3000,
        "stats": 10,
        "refresh": 10000
    }
}

host,user,passはsensu-apiの設定時に指定した値を指定してください。
uchiwa自体に認証を設ける場合は、uchiwaの方のuser,passをしています。
```

## 自動起動の設定とSensuの起動
各コンポーネントをバラバラに入れた場合は、それぞれのサーバでそれぞれをONにしてください。
Clientについては、sensu-clientだけ起動すればOKです。

```
# chkconfig sensu-server on
# chkconfig sensu-client on
# chkconfig sensu-api on
# chkconfig uchiwa on

# service sensu-server start
# service sensu-client start
# service sensu-api start
# service uchiwa start
```

# uchiwaにアクセス
http://ip_address:3000/
clientとして、sensu-server自身が1つ登録された状態で見えると思います。


# この後の設定
http://sensuapp.org/docs/0.16/
この後は、実際の監視設定をしていくことになります。
ドキュメントのGetting Started以降を進めていきましょう。
気が向いたらまた書きます。


# sensuに対する疑問(誰か教えて)
まだ調べている途中ですが、sensuって基本的には監視対象のlocalでcheckスクリプトを実行している形になりますよね。内部からの監視と言うやつです。外部からの監視って出来ないんでしょうかね？例えばhttpのチェックなどはlocalでlocalhostにアクセスしてチェックではなく、ちゃんと外部からhttpに接続して200返すか？とかのチェックってできないのでしょうか。誰か教えてください。

(sensu-serverのclient設定で監視対象をcheck_httpすれば、出来なくはないけど、失敗時に異常になるのはserverになっちゃいますよね。そもそもなんか違う気がする。)