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_aliases
和 cd /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
刚接触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_aliases
和 cd /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