Vagrant の shell-provisioning で rbenv から ruby をインストールしようとしてハマったのでメモ。
以下のような rbenv.sh を作って、
#!/bin/bash
sudo apt-get install -y libssl-dev libreadline-dev
# Install rbenv, ruby-build
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
cd ~/.rbenv
mkdir shims versions plugins
git clone https://github.com/sstephenson/ruby-build.git plugins/ruby-build
git clone https://github.com/sstephenson/rbenv-default-gems.git plugins/rbenv-default-gems
cd
# Setting rbenv path
cat << '__EOF__' > ~/.bashrc.d/rbenv.sh
export RBENV_ROOT="$HOME/.rbenv"
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"
__EOF__
# Setting default-gems
cat << '__EOF__' > ~/.rbenv/default-gems
rbenv-rehash
bundler
__EOF__
Vagarntfile ではこんな感じに指定する。
Vagrant.configure("2") do |config|
config.vm.provision "shell", path: "rbenv.sh", privileged: false
end
これで rbenv は使えるようになる。
ここからさらに ruby をインストールしたいので、rbenv.sh に追加。
# install ruby
rbenv install 2.1.1
rbenv global 2.1.1
rbenvコマンドが見つからない。
ssh で入ると普通に使えるんだけど、なぜか provisioning 時に PATH が設定出来てない。
これではどうか?
# set environmental-variables
source ~/.bashrc.d/rbenv.sh
# install ruby
rbenv install 2.1.1
rbenv global 2.1.1
・・・同じくrbenvコマンドが見つからない。
原因は .bashrc。
デフォルトの .bashrc の先頭の方にはこういう記述がある。
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
要するに、Vagrantが provisioning する時に使っている shell は non-interactive で、
non-interactive なアクセスの時には色々余計な事をしないように、ここ以降は読み込まれないようになっている。
だから PATH が設定さていなかったのだし、再度 source し直しても当然何も起こらない。
こうしたら動いた。
# set interactive environmental-valiables
PS1='$ '
source ~/.bashrc
# Install ruby
rbenv install 2.1.1
rbenv global 2.1.1