はじめに
OSX上でHomebrewのrbenvでrubyをインストールしてAnsibleのgemモジュールでbundlerなどグローバルにgemをインストールするプレイブックを作るときにちょっとハマったのでメモです。
プレイブックのソースは hnakamur/ansible-role-osx-rbenv にあります。Ansible Galaxyにもhnakamur.osx-rbenv として登録しています。
Homebrewのrbenvとrubyのインストールディレクトリ
homebrewでrbenvをインストールすると、rbenvのスクリプトは/usr/local/bin/rbenvに配備されます。一方、rbenvでインストールしたrubyは~/.rbenv/versions/以下に配備されます。
Ansibleのgemモジュールのuser_installパラメータに注意
Ansibleのgemモジュールにはuser_installというパラメータがあり、デフォルトはyesになっています。
gemモジュールのソースを見るとyesの場合は --user-install
、noの場合は --no-user-install
をgemコマンドへのオプションに指定するようになっています。オプション無しで呼び出すことはなく、必ずどちらかのオプションが指定されるわけです。
Ansibleのgemモジュールにはexecutableパラメータがあるので、~/.rbenv/shims/gem
を指定すればrbenvでインストールしたgemコマンドを使うことは出来ます。
- gem: name={{ item }} state=latest user_install=no executable=~/.rbenv/shims/gem
notify: rbenv rehash
with_items: rbenv_global_gems
試してみたところ、user_install=noを指定しないと(yesを指定したのと同じ)gemは/usr/local/lib/ruby/gems/以下にインストールされました。user_install=noを指定すると希望通り ~/.rbenv/versions/{{ rbenv_ruby_version }}/lib/ruby/gems/ にインストールされることがわかりました。
なんとなく逆のイメージだったのですが、rbenvの場合は ~/.rbenv/versions/{{ rbenv_ruby_version }} のほうがシステム領域になるということなのかなと理解しました。
ということで、今回のケースではuser_install=noが必要ですという話でした。