Kengo's blog

Technical articles about original projects, JVM, Static Analysis and TypeScript.

ウェブサービス系OSSの浸透を期待して開発環境を配布するまで

あるいはVagrantでplayframework 2.0系ウェブサービスの環境を立ち上げるまで。

PARTAKEの開発者がいまいち増えずチケットばかりが積み重なるのは、サービスという粒度が大きすぎて環境を作るのが面倒なことも一因だと思っています。ここを手助けできないか試してみました。結果、

  • VagrantでUbuntuを起動して
  • chef-soloでJDKやPlay!やPostgresをインストールして
  • VirtualBoxの共有フォルダを使ってソースコードをホストとゲストで共有する

のすべてがvagrant upコマンドひとつでできるようになりました。「セットアップが面倒」という問題はだいぶ解消できたと思います。インストールの時間が結構長いですし、Twitter APIを使うためのトークン取得が必要なので、完全解決では無いのが残念ですが……。

もちろん従来通りissueの追加やissueに関する議論などもお待ちしていますが、この取り組みによってビルドまでトライしてくれる人が増えることを願っています。

この記事の残りでは、やったこととつまずいたことを備忘的にまとめます。

やったこと

Play!のcookbookにはメジャーなものは無いようです。typesafe-stackは違うなぁという感じ。今回はjakedavis/chef-playを使いましたが、これはplayをrootで入れているので、root以外のユーザでplayを蹴る場合は改変が必要です。

JDK, postgresはコミュニティで配布されているものを使って大丈夫です。JDKのダウンロードとインストールは時間を食うので、あらかじめインストールしたBOXを用意しても良いかもしれません。

$ knife configure
$ knife solo init partake-vagrant
$ cd partake-vagrant
$
$ knife cookbook site vendor java
$ knife cookbook site vendor database
$ knife cookbook site vendor postgresql
$
$ knife cookbook create apt-get-update -o site-cookbooks
$ knife cookbook create init-db -o site-cookbooks
$ knife cookbook create play -o site-cookbooks
$ (最後にVagrantfileと独自cookbookを編集)

独自のcookbookの内容についてはリポジトリをご覧ください。

site-cookbooks内のレシピについて

apt-get-updateはpostgresqlインストール前にapt-get updateを実行するためのレシピを含みます。動機は後述。

init-dbはアプリケーションが必要とするユーザならびにデータベースの作成を行うレシピを含みます。テーブルはPlay!が作成するので、Chefで管理する必要はありませんでした。開発用なので権限などセキュリティ周りの話は考えていません。

Vagrantfileでゲストのメモリ量を指定する

config.vm.customizeを使うように説明している旧バージョン向けの情報が多いですが、現在のバージョン2ではproviderの設定を使う必要があります。 VirtualBoxならこんな感じです。

  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "1536"]
  end

トラブル

苦労したのは、やっぱりというかなんというか、ドキュメントです。英語のものでもあまり整備されておらず、コードを読んで公式ドキュメントの誤りに気づいていく必要がありました。postgresひとつをきちんと動かすだけで数時間使っています。

この点で、先日達人出版会からも発売された"入門ChefSolo"は良い道案内になってくれました。当初は価格設定に疑問を感じていましたが、Chef/Vagrant周りに感心をお持ちの方は購入を検討されても良いかと思います。

入門Chef Solo - Infrastructure as Code

入門Chef Solo - Infrastructure as Code

postgresqlのインストールが失敗する

素直にpostgresqlのcookbookを実行すると、以下のようなエラーでインストールに失敗します。

[2013-04-04T07:03:57+00:00] ERROR: Running exception handlers
[2013-04-04T07:03:57+00:00] ERROR: Exception handlers complete
[2013-04-04T07:03:57+00:00] FATAL: Stacktrace dumped to /tmp/vagrant-chef-1/chef-stacktrace.out
[2013-04-04T07:03:57+00:00] FATAL: Chef::Exceptions::Exec: package[postgresql-client] (postgresql::client line 32) had an error: Chef::Exceptions::Exec: apt-get -q -y install postgresql-client=9.1+129 returned 100, expected 0
Chef never successfully completed! Any errors should be visible in the
output above. Please fix your recipes so that they properly complete.

調査するにはvagrant sshでログインしてダンプを見たり、実際にコマンドを手実行すると良いです。今回はapt-get updateを実行すればいいだけでしたのでStack Overflowを参考に対応しました。

postgresqlのcookbookを独自cookbookであるapt-get-update cookbookに依存させ、この独自cookbook内でsudo apt-get updateを実行しています。

postgresqlへのデータベース作成がコケる

database cookbookの公式ドキュメントに従ってデータベースを作成するとLoadError (no such file to load -- pg)というエラーが出ます。レシピに

gem_package "pg" do
  action :install
end

と追加して、pgをインストールすれば解決できます。設定の問題なのかレシピのバグなのかちょっと切り分けられていません。公式ドキュメントを見る限り、pgは自動で入りそうなのですが……。

CentOS6でVagrantが立ち上がらない

さくらVPSにVagrantを入れたときに、以下のエラーでVagrantが立ち上がりませんでした。

$ vagrant --version
/opt/vagrant/bin/vagrant: /opt/vagrant/bin/../embedded/bin/ruby: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory

依存先がないだけなので、必要なものを探してインストールしてやります。今回はじめてyum providesの存在を知りました。これは便利ですね。

$ yum provides ld-linux.so.2
:
:
glibc-2.12-1.107.el6.i686 : The GNU libc libraries
:
:
$ sudo yum install glibc-2.12-1.107.el6.i686

Windows7に立てたVM内でPlay!がきちんと動かない

詳細はログを見ていただくとして、早い話がWindowsを使うなという話のようです……。Windowsは好きなんですが、やはり苦労も多いです。

他にできそうなこと

開発を助けるという点では、まだまだできることはありそうです。気が向いたら試します。

  • TwitterAPIのトークン設定の自動化(そもそも可能かどうか不明)
  • play runの自動化
  • playをPATHに通す
    • ln -s /home/vagrant/play-2.0.4/play /usr/local/bin/playをChefに蹴らせる?
  • login時にREADMEなどを表示