Vagrantのshellプロビジョニングでよくsudoを使ったスクリプトを見かけますが、Shell Provisionerはデフォルトではroot
で実行されるので基本的にsudoは不要だったりします。
自分もつい最近までvagrant
ユーザで実行されるものだと思い込んでいて全部sudoで書いていました。
(root
がsudoを使っても別にいいと思うので、どちらでも実行できるようにsudoで書いておくという考えもなくはないかもしれない)
Shell Scripts - Provisioning - Vagrant Documentation より:
privileged (boolean) - Specifies whether to execute the shell script as a privileged user or not (sudo). By default this is "true". This has no effect for Windows guests.
privileged
オプションがtrue
だとroot
で実行されるようです。そしてデフォルトはtrue
と。
この辺を見ると(スクリプト自体が)sudoで実行されそうな感じが伝わってきます。
https://github.com/mitchellh/vagrant/blob/master/plugins/provisioners/shell/provisioner.rb#L87
こんな実験。
config.vm.provision "shell", inline: <<-SHELL
whoami #=> root
echo $HOME #=> /root
SHELL
config.vm.provision "shell", privileged: false, inline: <<-SHELL
whoami #=> vagrant
echo $HOME #=> /home/vagrant
SHELL
root
の時にsudoを実行してもたいして問題はありませんが、$HOME
を参照する際は注意が必要そうですね。というか/home/vagrant
だと思い込んでいたのではまりました。
たぶん、デフォルトでこんなのが書かれているのが原因なんじゃないですかね。
(2016-07-22現在、sudoがない形にコメントのサンプルが修正されていました)
# Enable provisioning with a shell script. Additional provisioners such as
# Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
# documentation for more information about their specific syntax and use.
# config.vm.provision "shell", inline: <<-SHELL
# sudo apt-get update
# sudo apt-get install -y apache2
# SHELL
sudo使ってるし。