【#Sensu】Chef Solo（chef-solo） を使って Sensu Server と Uchiwa をインストール #GetChef_ja

AWS の EC2 インスタンス上に作成した Linux （RHEL6.5系）環境で Chef Solo と Berkshelf を使って Sensu Server と Sensu のダッシュボードである Uchiwa をインストールした際の手順を自分用のメモとしてまとめました。

## 1: iptables の無効化

AWS の セキュリティグループの機能で適切なセキュリティ設定が行われていることを前提に、 iptables を無効化します。

### 手順 1-1: iptables サービスを停止します

```bash
[bash]$ sudo service "iptables" stop
[bash]$ sudo service "iptables" status

iptables: Firewall is not running.
```

→ 上記のように表示されることを確かめます。

### 手順 1-2: iptables サービスの自動起動を無効化します

```bash
[bash]$ sudo chkconfig "iptables" off
[bash]$ chkconfig --list | grep "iptables"

iptables        0:off   1:off   2:off   3:off   4:off   5:off   6:off
```

→ 上記のように表示されることを確かめます。

## 2: Chef Development Kit (Chef-DK) のセットアップ

Chef と Berkshelf のインストール手順です。

Chef-DK をインストールすることで、Chef と Berkshelf をまとめてインストールします。

### 手順 2-1: Chef-DK と Git をインストールします

```bash
[bash]$ sudo yum -y install "git" "https://packagecloud.io/chef/stable/download?distro=6&filename=chefdk-0.2.2-1.x86_64.rpm"
[bash]$ rpm -qa | egrep "git-|chefdk"

git-1.7.1-3.el6_4.1.x86_64
chefdk-0.2.2-1.x86_64
```

### 手順 2-2: ディレクトリ `/etc/chef/` を作成します

```bash
[bash]$ sudo mkdir -p /etc/chef
[bash]$ ls -ld /etc/chef/

drwxr-xr-x 2 root root 4096 Xxx XX XX:XX /etc/chef/
```

### 手順 2-3: Chef Solo の設定ファイル `solo.rb` を作成します

```bash
[bash]$ cat << EOF | sudo tee /etc/chef/solo.rb
environment_path "/etc/chef/environments"
data_bag_path "/etc/chef/data_bags"
cookbook_path "/var/chef/cookbooks"
file_cache_path "/var/cache/chef"
EOF
```


## 3: ラッパークックブックの作成

### 手順 3-1: Cookbook の置き場を作成します

```bash
[bash]$ sudo mkdir -p /var/chef/site-cookbooks
[bash]$ ls -ld /var/chef/site-cookbooks/

drwxr-xr-x 2 root root 4096 Xxx XX XX:XX /var/chef/site-cookbooks
```

### 手順 3-2: berks コマンドを使って `wrapper-cookbook` という名前でクックブックのひな形を作成します

```bash
[bash]$ cd /var/chef/site-cookbooks/
[bash]$ sudo chef exec berks cookbook "wrapper-cookbook" --skip-vagrant --skip-test-kitchen  --license="reserved" --maintainer="YOUR_NAME" --maintainer-email="YOUR_EMAIL"
[bash]$ ls -ld /var/chef/site-cookbooks/wrapper-cookbook/

drwxr-xr-x 10 root root 4096 Xxx XX XX:XX /var/chef/site-cookbooks/wrapper-cookbook/
```

### 手順 3-3: Cookbook のメタデータ設定ファイル `metadata.rb` を編集します

```bash
[bash]$ cat << EOF | sudo tee -a /var/chef/site-cookbooks/wrapper-cookbook/metadata.rb
depends 'sensu'
depends 'uchiwa'
EOF
```

```rb:metadata.rb
name             'wrapper-cookbook'
maintainer       'YOUR_NAME'
maintainer_email 'YOUR_EMAIL'
license          'All rights reserved'
description      'Installs/Configures wrapper-cookbook'
long_description 'Installs/Configures wrapper-cookbook'
version          '0.1.0'

depends 'sensu'
depends 'uchiwa'
```

手順 3-4: Cookbook の依存関係設定ファイル Berksfile を編集します

```bash
[bash]$ cat << EOF | sudo tee /var/chef/site-cookbooks/wrapper-cookbook/Berksfile
source "https://api.berkshelf.com"
cookbook "sensu", git: "git://github.com/sensu/sensu-chef.git"
cookbook "uchiwa", git: "git://github.com/sensu/uchiwa-chef.git"
metadata
EOF
```

### 手順 3-5: Cookbook のデフォルトレシピファイル `default.rb` を編集します

```bash
[bash]$ cat << EOF | sudo tee -a /var/chef/site-cookbooks/wrapper-cookbook/recipes/default.rb
package "gcc"
include_recipe "sensu::default"
include_recipe "sensu::rabbitmq"
include_recipe "sensu::redis"
include_recipe "sensu::server_service"
include_recipe "sensu::api_service"
include_recipe "sensu::dashboard_service"
include_recipe "uchiwa::default"
EOF
```

```rb:default.rb
#
# Cookbook Name:: wrapper-cookbook
# Recipe:: default
#
# Copyright (C) 2014 YOUR_NAME
#
# All rights reserved - Do Not Redistribute
#
package "gcc"
include_recipe "sensu::default"
include_recipe "sensu::rabbitmq"
include_recipe "sensu::redis"
include_recipe "sensu::server_service"
include_recipe "sensu::api_service"
include_recipe "sensu::dashboard_service"
include_recipe "uchiwa::default"
```

## 4: クックブックの適用

### 手順 4-1: Berkshelf を使って依存関係のあるクックブックをダウンロードします

```bash
[bash]$ cd /var/chef/site-cookbooks/wrapper-cookbook/
[bash]$ sudo chef exec berks vendor /var/chef/cookbooks
[bash]$ ls -l /var/chef/cookbooks/

total 72
drwxr-xr-x.  4 root root 4096 Xxx XX XX:XX 7-zip
drwxr-xr-x.  9 root root 4096 Xxx XX XX:XX apt
drwxr-xr-x.  9 root root 4096 Xxx XX XX:XX ark
-rw-------.  1 root root 1249 Xxx XX XX:XX Berksfile.lock
drwxr-xr-x.  5 root root 4096 Xxx XX XX:XX build-essential
drwxr-xr-x.  8 root root 4096 Xxx XX XX:XX chef_handler
drwxr-xr-x.  4 root root 4096 Xxx XX XX:XX erlang
drwxr-xr-x.  7 root root 4096 Xxx XX XX:XX nodejs
drwxr-xr-x.  8 root root 4096 Xxx XX XX:XX rabbitmq
drwxr-xr-x.  8 root root 4096 Xxx XX XX:XX redisio
drwxr-xr-x. 11 root root 4096 Xxx XX XX:XX sensu
drwxr-xr-x.  6 root root 4096 Xxx XX XX:XX uchiwa
drwxr-xr-x.  8 root root 4096 Xxx XX XX:XX ulimit
drwxr-xr-x.  8 root root 4096 Xxx XX XX:XX windows
drwxr-xr-x.  9 root root 4096 Xxx XX XX:XX wrapper-cookbook
drwxr-xr-x.  8 root root 4096 Xxx XX XX:XX yum
drwxr-xr-x.  4 root root 4096 Xxx XX XX:XX yum-epel
drwxr-xr-x.  4 root root 4096 Xxx XX XX:XX yum-erlang_solutions
```

### 手順 4-2: Node の設定ファイル `node.json` を作成します

```bash
[bash]$ cat << EOF | sudo tee /etc/chef/node.json
{
  "run_list": "wrapper-cookbook::default"
}
EOF
```

### 手順 4-3: Environment の置き場を作成します

```bash
[bash]$ sudo mkdir -p /etc/chef/environments
[bash]$ ls -ld /etc/chef/environments/

drwxr-xr-x 2 root root 4096 Xxx XX XX:XX /etc/chef/environments
```

### 手順 4-4: Environment の設定ファイル `development.json` を作成します

```bash
[bash]$ cat << EOF | sudo tee /etc/chef/environments/development.json
{
  "name": "development",
  "json_class": "Chef::Environment",
  "chef_type": "environment",
  "default_attributes": {
    "sensu": {
      "version": "0.13.1-1",
      "use_unstable_repo": false,
      "log_level": "info",
      "use_ssl": true,
      "use_embedded_ruby": true, 
      "init_style": "sysv",
      "service_max_wait": 10,
      "rabbitmq": {
        "host": "localhost",
        "port": 5671,
        "vhost": "/sensu",
        "user": "sensu",
        "password": "password"
      },
      "redis": {
        "host": "localhost",
        "port": 6379
      },
      "api": {
        "host": "localhost",
        "bind": "0.0.0.0",
        "port": 4567
      }
    },
    "uchiwa": {
      "setting": {
        "user": "admin",
        "pass": "supersecret",
        "stats": 10,
        "refresh": 10000,
        "host": "0.0.0.0",
        "port": "3000"
      }
    }
  }
}
EOF
```

### 手順 4-5: SSL 鍵を生成し Data bag 用のディレクトリにコピーします

```bash
[bash]$ cd /var/chef/cookbooks/sensu/examples/ssl/
[bash]$ PATH=/opt/chefdk/embedded/bin/:$PATH
[bash]$ sudo chef exec ./ssl_certs.sh generate
[bash]$ sudo mkdir -p /etc/chef/data_bags/sensu
[bash]$ sudo cp -p ssl.json /etc/chef/data_bags/sensu/
[bash]$ sudo chef exec ./ssl_certs.sh clean
[bash]$ ls -l /etc/chef/data_bags/sensu/ssl.json

-rw-r--r-- 1 root root XXXX Xxx XX XX:XX /etc/chef/data_bags/sensu/ssl.json
```

### 手順 4-6: Chef Solo を使って Sensu Server をインストールします

```bash
[bash]$ sudo chef-solo -j "/etc/chef/node.json" -E "development"
```

### 手順 4-7: ブラウザを使って http://[IPAddress]:3000/ にアクセスします

```
以下を入力して [OK] ボタンをクリックします。
  [ユーザー名:] "admin",
  [パスワード:] "手順 4-4: で設定したパスワードを入力します"
```

→ Sensu のダッシュボード（Uchiwa）が表示されれば成功です。

以上