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の環境ってまだ多いもんだなあ。