HomebrewのrbenvとAnsibleのgemモジュールを使う場合はuser_install=noが必要

More than 3 years have passed since last update.


はじめに

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コマンドを使うことは出来ます。


https

- 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が必要ですという話でした。