berkshelf を使って rbenv 経由で ruby を install する方法
イントロ
chef で環境構築したはいいものの、ruby の install は意外と手間だったりします。
できれば rbenv のようなものを使って、色々な ruby のバージョンを試せる方がいいですよね。
ところが肝心の rbenv を install するレシピの自作は結構シンドい。
そんなあなたのために。
必要なもの
- berkshelf
- knife-solo(chef)
- vagrant
手順
1. Berksfile を書く
site :opscode cookbook 'ruby_build' cookbook 'rbenv', github: "fnichol/chef-rbenv"
rbenv の cookbook は必ず fnichol/chef-rbenv を指定。
2. nodes(attribute) ファイルを書く
{ "run_list": [ "ruby_build", "rbenv::user" ], "rbenv": { "user_installs": [ { "user": "vagrant", "rubies": ["1.9.3-p392", "2.0.0-p0"], "global": "1.9.3-p392" } ] } }
何故 github からレシピを取ってくるのかと言うと、rbenv::user レシピを使いたいからです。これを使うことにより、attributes レベルで user, ruby の version, gem などが自在に設定でき、install することが可能です。
ざっと簡単に各属性について解説します。
- user_installs
- user が install するべきものをまとめた配列
- user
- ruby を install する対象の user 名
- rubies
- global
他にも沢山 attribute あるので、詳しくは公式 を見ていただけたら。
もしくは直接レシピ読むと、各 attribute をどう書けばよいか、何となくわかります。
3. cookbook を install する
berks install
まさに bundle install と同じことをしています。
4. レシピ適応
knife solo prepare hostname knife solo cook hostname
でよし。ログを見ると、頑張って install してくれている模様です。
* package[autoconf] action install (up to date) * rbenv_script[rbenv install 1.9.3-p392 (vagrant)] action run * package[gcc-c++] action nothing (skipped due to action :nothing) * package[patch] action nothing (skipped due to action :nothing) * package[readline] action nothing (skipped due to action :nothing) * package[readline-devel] action nothing (skipped due to action :nothing) .... * package[autoconf] action install (up to date) * rbenv_script[rbenv install 2.0.0-p0 (vagrant)] action run * package[gcc-c++] action nothing (skipped due to action :nothing) * package[patch] action nothing (skipped due to action :nothing) * package[readline] action nothing (skipped due to action :nothing)
5. 確認
$ vagrant ssh $ ruby -v #=> ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-linux] $ rbenv versions * 1.9.3-p392 (set by /home/vagrant/.rbenv/version) 2.0.0-p0
global で 1.9.3 が入り、2.0.0 も一緒に入っていることがわかります。