##要点
nvmのインストールに限った話ではなくて、provisionをshell
で行うとき(※たぶんchefとかのときも?)に共通して言えること。
ついつい先入観でprovisionはvagrant(ユーザ)権限
で実行されると思いがち(自分だけ?)だけど、実際にはroot権限で実行されるため、
- なにがしかのスクリプトの中で
$HOME
を参照している - provision中に
/home/vagrant下
にファイルやディレクトリを生成する
ような場合には注意が必要です。
では、nvmのインストールでの具体例を…
Install script じゃダメ
Shell Provision はroot権限
で実行されるので
curl https://raw.github.com/creationix/nvm/master/install.sh | sh
# or
wget -qO- https://raw.github.com/creationix/nvm/master/install.sh | sh
は使えない。
install.sh で $HOME
を参照しているため、/root
に .nvm
が生成されてしまう。
というわけで…
Manual inatall する
でも、単純にREADMEのコピペじゃダメ
/home/vagrant
にインストールしたいので、~/.nvm
を
/home/vagrant/.nvm
と読み替えるのを忘れずに。
ついでに汎用化して
init_nvm.sh
#!/bin/bash
home=/home/$1
node_version=$2
# install nvm
git clone https://github.com/creationix/nvm.git $home/.nvm
# install node
source $home/.nvm/nvm.sh
nvm install $node_version
# ログインシェルに登録
cat << _EOT_ >> $home/.bashrc
source ~/.nvm/nvm.sh
nvm use $node_version > /dev/null
_EOT_
Vagrantfile には
Vagrantfile
config.vm.provision :shell, inline: <<-EOT
# install git
yum -y install git
# install nvm/node
sh /path/to/init_nvm.sh "vagrant" "0.10.22"
# -----------------------
# 実はこれが一番重要かも
# -----------------------
# provisionの最後とかに、/home/vagrant/*の権限をvagrantに変更する。
# - 上述の通り、shell provisionはroot権限で実行され、
# - provision中に生成されたファイルの権限はrootになっているので。
chown vagrant.vagrant -R /home/vagrant
EOT
これで vagrant up --provision
後に vagrant ssh
して
[vagrant@localhost ~]$ node -v
v0.10.22
であればOK!