11
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

はじめに

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://github.com/hnakamur/ansible-role-osx-rbenv/blob/e1bc823b3787886e7ea66f7c90904b8ef954146b/tasks/main.yml#L33-L35
- 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が必要ですという話でした。

11
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?