如何从配置程序重新启动 Vagrant 客户机?

如何从配置程序重新启动 Vagrant 客户机?

我是 Vagrant 的新手,每次想要启动新的 Ubuntu VM 时,我都试图避免手动执行安装过程。

完成安装后,我通常会使用 和 更新机器的所有软件apt-get updateapt-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

相关内容