2

想象以下场景:

  • 全新安装,未篡改的 VirtualBox 安装
  • 通过 gem 新安装的 Vagrant 1.0.6

现在我试试这个:

  • vagrant box add box_one [url to box one]
  • vagrant init box_one
  • vagrant up

到目前为止,一切都很好。box_one效果很好。它显示在 VirtualBox 管理器中,所有端口转发设置正确,我可以 ssh 进入它,Web 服务器运行 - 一切都很好。

  • vagrant halt
  • rm Vagrantfile

据我了解,这应该使我能够做到这一点:

  • vagrant box add box_two [url to box two]
  • vagrant init box_two
  • vagrant up

并使用box_two. 但相反,它显然使用了box_two- 转发不同端口的配置 - 但它会引导box_one. 在 VirtualBox Manager 中,它显示了两台具有不同 id 的机器——但它们都是box_one.

它似乎对我的同事有用,所以我机器上的某些东西一定是触发了那个错误。(或者我做了一些奇怪的事情,谁知道呢。)

有谁知道它可能是什么?

4

2 回答 2

9

好的,我的错误是我试图在同一个目录中执行此操作。这样它就一直使用相同的.vagrant文件 - 所以修复是继续删除.vagrant文件或在不同的目录中运行 vagrant 操作。

于 2013-03-12T12:24:18.933 回答
3

从两个不相关的目录(每个目录都有自己的本地、不同Vagrantfile.vagrant目录)运行 Vagrant 时也会出现类似的问题——有时 Vagrant 会完全连接到错误的 VM。对于在 OSX 上运行 Vagrant 1.5.x 的我来说,这种情况不一致但经常发生。

如果您看到这种行为,我发现解决它的唯一方法是向现有的 Vagrantfile 添加更多信息。就我而言,当 Vagrantfile 看起来像这样时,问题就发生了:

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "some-box-name"
  config.vm.network "forwarded_port", guest: 8000, host: 8001
  config.vm.provider "virtualbox" do |vb|
    vb.gui = false
  end
end

并通过添加设置的行来解决vb.name

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "some-box-name"
  config.vm.network "forwarded_port", guest: 8000, host: 8001
  config.vm.provider "virtualbox" do |vb|
    vb.gui = false
    vb.name = "x1_165165261578"  ## added this line
  end
end

显然 Vagrant 使用 Virtualbox 盒子名称来识别盒子,但是当它没有被给出时使用另一个标识符(也许是"default"Vagrant 盒子名称?)。这很奇怪,因为 VM 的唯一 ID 存储在其中,.vagrant/....../id并且是一个绝对标识符。这一定是个bug。

知道这可能会发生 - 在建立 Vagrant 连接后立即验证您正在使用的 VM 是一个很好的做法,例如通过将唯一的机器名称放在提示符中或其他方式。如果您有许多类似的机器,您可能不会注意到您使用了错误的机器,直到您做了一些非常糟糕的事情,例如将您打算用于测试环境的更改应用于生产!

于 2014-05-27T18:49:15.087 回答