ボクココ

個人開発に関するテックブログ

Vagrant, Pupet でRuby1.9.2 を RVM から入れられない場合の対応

かなりマニアックな内容だが・・。

Vagrant&PupetでRails開発環境をコマンド一発で作るのを作成中。
プッシュしようとしている対象のPaaSのRubyのバージョンが、なぜか1.9.2しばりというめんどい仕様だったので、仕方なくそれも1.9.2で対応しようとした。

最初はPupet側にこんなコードを書いていた


exec { 'install_rvm':
command => "${as_vagrant} 'curl -L https://get.rvm.io | bash -s stable'",
creates => "${home}/.rvm/bin/rvm",
require => Package['curl']
}

exec { 'install_ruby':
command => "${as_vagrant} '${home}/.rvm/bin/rvm install 1.9.2 --autolibs=enabled'",
creates => "${home}/.rvm/bin/ruby",
require => Exec['install_rvm']
}

これが問題の始まり。ruby2.0.0や1.9.3のインストールは普通にうまくいくのに、1.9.2は失敗する。
仕方ないので、rvm install 1.9.2をシェルのほうで実行させようと、Vagrantfileを書きかえて、普通にこんな感じで書いた

#!/usr/bin/env bash

su - vagrant -c '
rvm install 1.9.2
'

するとログにこんなエラーが

dpkg: warning: 'ldconfig' not found in PATH or not executable.
dpkg: warning: 'start-stop-daemon' not found in PATH or not executable.

SSHで入って同じコマンドを打つと、ちゃんとできるやんけ!!
なんで見つからないんだーとここでドハマリ。

原因

Vagrant構築中、つまりシェルの実行中は/etc/environment が読み込まれないらしい。
Vagrant構築が終わってSSHで入ったら/etc/environmentが読み込まれる。
ここに、/sbin, /usr/sbin のパスが入っている。
Ruby1.9.2では、このパスにあるコマンドを実行している模様。
だからより上位のRubyはインストールできても、1.9.2はどうしてもインストールできなかった。


と、いうことで。。こんな対応で動いた。


#!/usr/bin/env bash

su - vagrant -c '
PATH=$PATH:/sbin:/usr/sbin/
rvm install 1.9.2
'

んーなんとも強引な感じ。願わくばPuppet側でvagrantユーザになった時のPATH指定とかできればいいな。