Chef Soloでelasticsearchの環境を作る

gemのバージョンはこんなかんじ。

berkshelf (2.0.10)
chef (11.8.2)
knife-solo (0.4.1)

複数台のサーバーに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の正しい始め方などを参考にされるとよいかと思います。

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以下に作成された、\.jsonファイルのrun_listに、role[elasticsearch]を書き入れます。

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

そして、cookします。

$ knife solo cook <host>

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

$ 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}

こんなかんじになれば、きちんとインストールできているかと思います。

$ 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
Chef Soloの正しい始め方
Berkshelfを試してみる