如何从供应商重新启动 Vagrant 来宾?

Dar*_*ord 6 virtualbox ubuntu vagrant

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
Run Code Online (Sandbox Code Playgroud)

这主要完成了这项工作——我可以在包更新时看到 VM 的输出——但是在它重新启动并vagrant ssh进入之后,我的文件都没有出现在/vagrant. 我假设由于某种原因没有重新安装共享文件夹。

我想我的第一个问题是:作为 shell 配置器的一部分更新这样的系统是否有意义?如果是这样,我如何重新启动来宾并仍然/vagrant安装共享?

小智 6

如果您只想在配置完成后重新启动(而不是在配置步骤之间),您可以使用触发器来实现此目的:

config.trigger.after [:provision] do |t|
  t.name = "Reboot after provisioning"
  t.run = { :inline => "vagrant reload" }
end
Run Code Online (Sandbox Code Playgroud)

这具有不需要安装插件的优点。

有关触发器的更多信息,请点击此处


小智 6

假设您的来宾虚拟机可以处理它,那么使用内置的 Shell Provisioner 重新启动可能是一个不错的选择。更多相关信息请参见此处在更改日志中查找重新启动,以了解何时添加和改进此功能。

示例块:

config.vm.provision :shell do |shell|
    shell.privileged = true
    shell.inline = 'echo rebooting'
    shell.reboot = true
end
Run Code Online (Sandbox Code Playgroud)


l0b*_*0b0 5

这正是vagrant-reload插件的用途。安装后,只需config.vm.provision :reload在要重新加载的配置中添加即可。