あるいは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
- 作者: 伊藤直也
- 出版社/メーカー: 伊藤直也
- 発売日: 2013/03/11
- メディア: Kindle版
- 購入: 16人 クリック: 1,027回
- この商品を含むブログ (4件) を見る
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などを表示