アペフチ

DroongaをインストールするItamaeレシピ

今日の日記はGroonga Advent Calendar 2015の五日目です。昨日はcosmo0920さんのGroonga族のHomebrewの変遷を振り返るでした。やっぱりコマンド一つで簡単にインストールできるのはよい。しかし、そのためには陰で誰かが苦労しているということも伺える記事だった。

今日は、Homebrewなどで一発インストールのできないGroonga族の一員、Droongaのインストールについて書く。

Groongaにはレプリケーション機能がない。DroongaはGroongaを複数のマシンにレプリケーションさせるプロダクトだ。公式サイトのほか、去年のGroonga Advent Calendarにも記事があって、とても面白く読んだ。Droongaが何かということはこれらを見てほしい。

公式サイトには勿論インストール手順も書かれているのだが、今日時点でこれはうまくいかない。そこで僕は、サーバーの構成管理ツールであるItamaeのレシピを作ってインストールしている。今日はそれを使ったインストール方法を書こうと思う。以下、Vagrantを使ってUbuntu 15.04の環境で実行している。マシンイメージはVagrant Cloudから公式のイメージを持って来た。

Droongaのインストール時にはメモリーが必要なので、Vagrantfileに設定を書いて2GiBくらい確保しておく。

Vagrant.configure(2) do |config|
  config.vm.define :ubuntu1504 do |node|
    node.vm.box = "ubuntu/vivid64"
    node.vm.provider "virtualbox" do |provider|
      provider.memory = 2048
    end
  end
  # :
  # :
end

バーチャルマシンを起動したら、まずログインして環境を更新する。

[host]$ vagrant up ubuntu1504
[host]$ vagrant ssh ubuntu1504
[vm]$ sudo apt-get update
[vm]$ sudo apt-get upgrade -y

ここでようやくレシピの登場。GitHubに上げている(https://github.com/KitaitiMakoto/itamae-plugin-recipe-droonga)。gemまたはItamaeプラグインの形をしているがrubygems.orgには上げていないので、git cloneで持って来る必要がある。もっと一般的にしてからリリースしたいなと思って、そのまま時間が過ぎてしまっているのだ……。

[host]$ git clone https://github.com/KitaitiMakoto/itamae-plugin-recipe-droonga.git

リポジトリーをクローンしたら、Itamaeのレシピファイル(ここではrecipe.rb)を用意して、以下のように一行書く。

include_recipe "./itamae-plugin-recipe-droonga
/lib/itamae/plugin/recipe/droonga/default.rb"

そうしたらItamaeを実行すればよい。簡単だ。但し時間は掛かる。

[host]$ itamae ssh --vagrant --host ubuntu1504 recipe.rb

(上のイメージだとこれでいいが、DigitalOceanだと依存パッケージが足りなくてうまくいかなかったかも知れない。エラーメッセージを見ながら必要な物をインストールしてほしい。)

Droongaは二つのコンポーネントからなっている。Groongaデータベースを操作したり、他ノードと連携してレプリケーションを実現するDroonga Engineと、そこへのHTTPインターフェイスを提供するDroonga HTTP Serverだ。それぞれそれ用のプロセスを起動する必要がある。

公式サイトの記事ではserviceコマンドを使ってこれをコントロールすることになっているが、Ubuntuでは15.04からUpstartに代わってsystemdが導入されたので、レシピではsystemctlコマンドを使うようにしている。

[vm]$ sudo systemctl status droong-engine
● droonga-engine.service - Droonga Engine
Loaded: loaded (/lib/systemd/system/droonga-engine.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2015-12-04 20:09:56 UTC; 37s ago
Main PID: 30190 (droonga-engine)
CGroup: /system.slice/droonga-engine.service
(snip)
[vm]$ sudo systemctl status droonga-http-server
● droonga-http-server.service - Droonga HTTP Server
Loaded: loaded (/lib/systemd/system/droonga-http-server.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2015-12-04 20:09:57 UTC; 2min 11s ago
Main PID: 30228 (node)
CGroup: /system.slice/droonga-http-server.service
(snip)

これでDroongaが動くはずだし、実際EPUB Searcherデモサイトではこの方法でインストールして、現在でも動作している。

尚、Droongaを動かすには、内部・外部から、hostnameで返って来るホスト名で名前解決できる必要がある。hostnameと違うホスト名を使いたい場合は、レシピのインストールの箇所(Droonga Engine該当箇所Droonga HTTP Server該当箇所)の最後のbash実行時にHOST環境を設定し、また/etc/hostsでも設定する必要があるので書き換えること。

# :
# :
execute "curl -sL https://deb.nodesource.com/setup_0.12 | bash HOST=..." do
  not_if "test -e /etc/apt/sources.list.d/nodesource.list"
end
# :
# :
execute "curl https://raw.githubusercontent.com/droonga/droonga-engine/master/install.sh | bash HOST=..." do
  not_if "type droonga-engine"
end
# :
# :