Vagrant - 供应脚本不改变目录

Vagrant - Provisioning script not changing directory

刚接触vagrant,请帮忙!

Vagrantfile

Vagrant.configure("2") do |config|
  config.vm.box = "laravel/homestead"
  config.vm.provision "shell", path: "vm-setup/provision.sh"
end

vm-setup/provision.sh

# Update apt-get
apt-get -y update

# Install tree
apt-get install tree

# Create .bash_aliases
sudo echo 'alias cls="clear"' >> ~/.bash_aliases

sudo chsh -s $(which zsh) vagrant

cd /vagrant

provision.sh 文件 运行 没问题。当我 运行 "vagrant provision" 它更新 apt-get,安装树甚至将 shell 更改为 ZSH。

但是 sudo echo 'alias cls="clear"' >> ~/.bash_aliasescd /vagrant 行不起作用,不知道为什么。当我 vagrant ssh 进入机器时,我被带到根目录 (/home/vagrant)。我想从 /vagrant 文件夹开始。

Vagrant's shell provisioner 默认运行 privileged = true:

privileged (boolean) - Specifies whether to execute the shell script as a privileged user or not (sudo). By default this is "true".

当您执行 vagrant ssh 时,您以 vagrant 用户身份登录到 VM。

这就是为什么:

1.

# Create .bash_aliases
sudo echo 'alias cls="clear"' >> ~/.bash_aliases

它写入 root's ~/.bash_aliases 并且它确实存在:

root@vagrant:~# id
uid=0(root) gid=0(root) groups=0(root)
root@vagrant:~# cat .bash_aliases 
alias cls="clear"

解决方案: 写入 vagrant's 主文件夹:

# Create .bash_aliases
echo 'alias cls="clear"' >> /home/vagrant/.bash_aliases
chown vagrant:vagrant /home/vagrant/.bash_aliases

2.

cd /vagrant

这意味着文件夹已在提供脚本中更改,没有别的。

解决方案: 将此语句添加到 vagrant's .bash_aliases 以及:

echo 'cd vagrant' >> /home/vagrant/.bash_aliases

你的最终 vm-setup/provision.sh 是:

# Update apt-get
apt-get -y update

# Install tree
apt-get install tree

# Create .bash_aliases
echo 'alias cls="clear"' >> /home/vagrant/.bash_aliases
echo 'cd /vagrant' >> /home/vagrant/.bash_aliases
chown vagrant:vagrant /home/vagrant/.bash_aliases

chsh -s $(which zsh) vagrant

虽非如此,只求圆满:

在尝试使用 Vagrant 作为设置脚本的测试工具时,我曾多次挣扎,直到现在我才意识到根本原因:

使用这个 Vagrantfile 语句:

config.vm.provision "shell", path: "myScript.sh"

myScript.sh 内联 到虚拟机标准输入。这很好,因为您不需要从虚拟机内部访问实际脚本(通常通过 /vagrant 路径)。

...但它的缺点是任何相对路径都无法正常工作。

Of course: We can adjust it to absolute path based on /vagrant. But this requires to modify the script we are trying to test.

所以在这种情况下(我认为在任何情况下我们都不会禁用 /vagrant 共享),使用 "inline:" 选项和 [=42= 是一个更好的解决方案] 路径:

config.vm.provision "shell", inline: "/vagrant/myScript.sh"

...这将内联这条语句而不是文件内容和相对路径(甚至"script path based"如$(dirname "[=17=]")/relative/path)将正常工作。

此外,如果您要测试的设置脚本旨在由非特权用户执行(例如,如果它要设置一些用户配置,我们希望在 vagrant ssh -with vagrant user-) 添加 privileged: false 选项也是一个好主意,@Nickolay 指出:

config.vm.provision "shell", inline: "/vagrant/myScript.sh", privileged: false