Chefでrbenvを使ってRubyをインストールするCookbookを書いた

BerkshelfのおかげでCookbookの再利用がしやすくなったので独立したCookbookをもりもり書くようになった。
と言うわけでひとつまとめた物を公開してみた。

* akahigeg/rbenv-install-rubies-cookbook – GitHub
* rbenv-install-rubies – Opscode

これは何かというとrbenvのCookbookを使ってRubyをシステムワイドにインストールするもの。Attributeだけでインストールできるのがミソ。

JSONに以下のように書いて使う。

{
  "run_list": [
    "recipe[rbenv-install-rubies]"
  ],
  "rbenv-install-rubies": {
    "global_version": "2.0.0-p247",
    "other_versions": ["1.9.3-p448"],
    "gems": ["bundler", "rbenv-rehash", "pry", {"nokogiri": {"version": "1.5.10"}}],
    "lib_packages": ["libxml2-devel", "libxslt-devel"]
  }
}

Berkshelfを使うならBerkfileに以下のように書けば使える。

cookbook 'rbenv-install-rubies'

パーミッションの維持

rbenvをシステムワイドに入れるとgemをインストールするときにパーミッションの問題があるので、rbenvのversionsディレクトリのパーミッションを調整する仕組みを入れた。

以下のようにkeep-group-writeのレシピも含めて、rbenvのAttirbuteでgroup_usersも指定する。

{
  "run_list": [
    "recipe[rbenv-install-rubies]"
    "recipe[rbenv-install-rubies::keep-group-write]"
  ],
  "rbenv": {
   "group_users": ["john", "mike"]
  ],
  "rbenv-install-rubies": {
    "global_version": "2.0.0-p247",
    "other_versions": ["1.9.3-p448"],
    "gems": ["bundler", "rbenv-rehash", "pry", {"nokogiri" => {"version" => "1.5.10"}}],
    "lib_packages": ["libxml2-devel", "libxslt-devel"]
  }
}

この仕組みがないとgemを入れるのにsudoが必要だったり、gem installしたユーザーがGemのディレクトリのオーナーになってしまい他のユーザーがuninstallできなくなったりする。

ちなみに継続的なパーミッションの維持はcronによる力技で実現している。

cron以外の案

umaskとSGIDビットやincronなどを使ってスマートに出来ないか試行錯誤してみたけど、umaskはrbenvに無視されるし、incronは挙動が怪しいので諦めた。

rbenv-usergemsと言うものもあるけど、これもやや微妙であった。
各ユーザー用に事前にGemをインストールできなかったり、ChefでCookbookを作って入れようとすると/root/.usergemsを作ろうとしてパーミッション関係で怒られたり。

gem –user-installはパスが通らないし。

serverspec

serverspec+Vagrantでテストも書いてみた
serverspec楽しい。

Ruby 1.8.7のサーバーに対して実行するとき

最新版のrbenvのCookbookが1.8.7でサポートしていないハッシュの記法を使っているため、rbenvインストール前のRubyのバージョンが1.8.7だと使えなくなっている。そのため少し古いバージョンを使うようにする。
Berkfileなら以下のように書く。

site :opscode

cookbook 'rbenv', '~> 1.5.0' # for Ruby 1.8.7 system
cookbook 'rbenv-install-rubies'

同様にナウい記法を使ったら1.8.7で使えなくなったため、昔ながらの記法に戻したCookbookもあるようなので、rbenvのCookbookもいつの間にか直ってる可能性はある。

しかしデフォルトが1.8.7の環境ってまだ多いもんだなあ。