scramble cadenza

技術ネタのガラクタ置き場

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
    • ruby_build を使って install する ruby のバージョン。配列。
    • recipe[ruby_build] の include 必須
  • global
    • global に使う ruby の version
    • rbenv インストール後 "ruby -v" と打った時に出てくる version を指す

他にも沢山 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 も一緒に入っていることがわかります。