かなりマニアックな内容だが・・。
Vagrant&PupetでRails開発環境をコマンド一発で作るのを作成中。
プッシュしようとしている対象のPaaSのRubyのバージョンが、なぜか1.9.2しばりというめんどい仕様だったので、仕方なくそれも1.9.2で対応しようとした。
最初はPupet側にこんなコードを書いていた
これが問題の始まり。ruby2.0.0や1.9.3のインストールは普通にうまくいくのに、1.9.2は失敗する。
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']
}
仕方ないので、rvm install 1.9.2をシェルのほうで実行させようと、Vagrantfileを書きかえて、普通にこんな感じで書いた
するとログにこんなエラーが
#!/usr/bin/env bashsu - 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 bashsu - vagrant -c '
PATH=$PATH:/sbin:/usr/sbin/
rvm install 1.9.2
'
んーなんとも強引な感じ。願わくばPuppet側でvagrantユーザになった時のPATH指定とかできればいいな。