我是 Vagrant 的新手,每次想要启动新的 Ubuntu VM 时,我都试图避免手动执行安装过程。
完成安装后,我通常会使用 和 更新机器的所有软件apt-get update
,apt-get dist-upgrade -y
然后重新启动以确保所有升级生效。为此,我制作了一个 Vagrantfile,如下所示:
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/xenial64"
config.vm.provider "virtualbox" do |vb|
vb.memory = "4096"
end
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get dist-upgrade -y
shutdown -r now
SHELL
end
这基本上完成了工作 - 我可以看到软件包更新时来自 VM 的输出 - 但是在它重新启动并且我vagrant ssh
进入它之后,我的文件都没有出现在/vagrant
。我假设共享文件夹由于某种原因没有被重新挂载。
我的问题是:
- 作为 shell 配置程序的一部分,像这样更新系统有意义吗?
- 如果是这样,我该如何重新启动客户机并仍然挂载
/vagrant
共享?
答案1
这正是vagrant-reload插件的用途。安装后,只需config.vm.provision :reload
在配置中要重新加载的位置添加即可。
答案2
如果您只想在配置完成后重新启动(而不是在配置步骤之间),则可以使用触发器来实现:
config.trigger.after [:provision] do |t|
t.name = "Reboot after provisioning"
t.run = { :inline => "vagrant reload" }
end
这样做的好处是不需要安装插件。
有关触发器的更多信息这里。
答案3
假设你的客户虚拟机可以处理它,使用内置的 Shell Provisioner 重新启动可能是一个不错的选择。更多信息请参见这里. 在以下位置查找重启变更日志添加和改进此功能的时间。
示例块:
config.vm.provision :shell do |shell|
shell.privileged = true
shell.inline = 'echo rebooting'
shell.reboot = true
end
答案4
可以这样做:
config.vm.provision 'shell', path: 'part1.sh'
config.vm.provision 'shell', reboot: true
config.vm.provision 'shell', path: 'part2.sh'
https://developer.hashicorp.com/vagrant/docs/provisioning/shell#reboot