Chef Soloでelasticsearchの環境を作る


複数台のサーバーにelasticsearchの環境を作ろうと思い、Chef Soloを使ってやってみた際のメモです。chefはあまり慣れてないので変なこと書いてるかもです。

## リポジトリの作成
まずは、リポジトリを作成します。今回はchef-repoという名前のリポジトリにします。

```
$ knife solo init chef-repo
$ tree chef-repo
chef-repo
├── Berksfile
├── cookbooks
├── data_bags
├── environments
├── nodes
├── roles
└── site-cookbooks
```

## Cookbookを作成
今回はBerkshelfを使って、サードパーティのcookbookを使いたいので、Berksfileにelasticsearchの記述を追記し、cookbooksディレクトリの下にインストールします。cookbookをダウンロードするためには、Opscode Communityにユーザー登録したり、いろいろ設定したり必要ですが、それに関しては[Chef Soloの正しい始め方](http://tsuchikazu.net/chef_solo_start/)などを参考にされるとよいかと思います。

```Berksfile
site :opscode

cookbook ‘elasticsearch’
```

```
$ berks install -p cookbooks
```

## roleを定義する
rolesディレクトリの下にelasticsearch.jsonファイルを作り、以下のように設定します。デフォルトでは、javaのバージョンが1.6.0_28、elasticsearchのバージョンが0.90.5でインストールされますが、より新しいバージョンのものを使いたいため、`override_attributes`でattributesを上書きし、javaは1.7系、elasticsearchは0.90.7をインストールするように書いています。また、elasticsearchで使用するkuromojiなどのpluginのインストールも同時に行うように、`elasticsearch::plugins`というかたちで書きます。pluginインストールの設定については後述。

```
{
	“name”: “elasticsearch”,
	“default_attributes”: {},
	“override_attributes”: {
		“java”: {
			“install_flavor”: “openjdk”,
			“jdk_version”: “7”
		},
		“elasticsearch”: {
			“version”: “0.90.7”
		}
	},
	“json_class”: “Chef::Role”,
	“description”: “”,
	“chef_type”: “role”,
	“run_list”: [
		“recipe[java]”,
		“recipe[elasticsearch]”,
		“recipe[elasticsearch::plugins]”
	]
}
```

## plugin
インストールしたいelasticsearchのpluginに関しては、data_bagで設定してあげる必要があります。data_bags以下にelasticsearchディレクトリを掘り、その下にplugins.jsonファイルを作ります。elasticsearchのバージョンが0.90.7をインストールするので、kuromojiは、1.6.0を使います。また、私はいつもHQ pluginを使っているので、そちらも同時にインストールします。

```
{
	“id”: “plugins”,
	“_default”: {
		“plugins”: {
			“elasticsearch/elasticsearch-analysis-kuromoji”: { “version”: “1.6.0” },
			“royrusso/elasticsearch-HQ”: {}
		}
	}
}
```

## cook

ここまでできたら、cookしていきます。

```
$ knife solo prepare <host>
```

を実行し、nodes以下に作成された、\<host>.jsonファイルのrun_listに、`role[elasticsearch]`を書き入れます。

```
{
	“run_list”: [
		“role[elasticsearch]”	
	]
}
```

そして、cookします。

```
$ knife solo cook <host>
```

終了したら、ssh \<host>でログインし、きちんとインストールできているか確認します。

```
$ java -version
java version "1.7.0_45"
OpenJDK Runtime Environment (rhel-2.4.3.4.el6_5-x86_64 u45-b15)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)
```

```
$ curl -XPUT ‘localhost:9200/test/‘ -d ‘
{ 
  “index”:{
    “analysis”: {
      “tokenizer”: {
        “kuromoji”: {
          “type”:”kuromoji_tokenizer”,
          “mode”:”search”
        }
      },
      “analyzer” : {
        “kuromoji_analyzer” : {
          “type” : “custom”,
          “tokenizer” : “kuromoji_tokenizer”
        }
      }
    }
  }
}'
{"ok":true,"acknowledged":true}
```

`{"ok":true,"acknowledged":true}`が出れば、きちんとインストールできているかと思います。

```
$ curl -XGET 'localhost:9200/test/_analyze?analyzer=kuromoji_analyzer&pretty' -d '関西国際空港'
{
  "tokens" : [ {
    "token" : "関西",
    "start_offset" : 0,
    "end_offset" : 2,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "関西国際空港",
    "start_offset" : 0,
    "end_offset" : 6,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "国際",
    "start_offset" : 2,
    "end_offset" : 4,
    "type" : "word",
    "position" : 2
  }, {
    "token" : "空港",
    "start_offset" : 4,
    "end_offset" : 6,
    "type" : "word",
    "position" : 3
  } ]
}
```

分かち書きもきちんとできました。
いろいろと細かい設定もしたいところですが、今回はここまで。

## 参考
[cookbook-elasticsearch](https://github.com/elasticsearch/cookbook-elasticsearch)
[Chef Soloの正しい始め方](http://tsuchikazu.net/chef_solo_start/)
[Berkshelfを試してみる](http://qiita.com/uchiunyo/items/5aa243f7a39ae443e10d)