Help us understand the problem. What is going on with this article?

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

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

sakura_internet
さくらレンタルサーバ、さくらのVPS、 さくらのクラウド、さくらの専用サーバなどのインターネットサービス・ITプラットフォームを提供しています。
https://www.sakura.ad.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away