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