如何使用Vagrant运行多个虚拟机?

56

我需要使用Vagrant运行多个虚拟机。

是否有方法可以做到这一点?

这些虚拟机彼此之间没有任何关系,可以将它们视为用于测试的不同环境,因此似乎多机设置与此无关。

7个回答

56

最好的方法是使用一组散列。您可以像这样定义数组:

(array of hashes)
servers=[
  {
    :hostname => "web",
    :ip => "192.168.100.10",
    :box => "saucy",
    :ram => 1024,
    :cpu => 2
  },
  {
    :hostname => "db",
    :ip => "192.168.100.11",
    :box => "saucy",
    :ram => 2048,
    :cpu => 4
  }
]

然后您只需迭代服务器数组中的每个项目并定义配置:

Vagrant.configure(2) do |config|
    servers.each do |machine|
        config.vm.define machine[:hostname] do |node|
            node.vm.box = machine[:box]
            node.vm.hostname = machine[:hostname]
            node.vm.network "private_network", ip: machine[:ip]
            node.vm.provider "virtualbox" do |vb|
                vb.customize ["modifyvm", :id, "--memory", machine[:ram]]
            end
        end
    end
end

40
你绝对可以同时运行多个 Vagrant box,只要它们的配置不会以某种破坏性的方式相互冲突,例如在主机上映射相同的网络端口或在同一提供程序内使用相同的盒子名称/ID。与手动在提供程序上运行多个盒子(例如在 VirtualBox 上运行多个盒子)或由 Vagrant 注册并启动它们没有区别。结果是相同的,Vagrant 只是简化了这个过程。
您可以使用所谓的multi-machine 环境来在一个项目/Vagrantfile 中管理这些 box。它们不必有任何联系,仅仅出于管理方便的原因,例如如果您需要同时启动它们。
或者您可以使用单独的项目/Vagrantfiles,并从各自的目录中管理这些机器,完全分离。
在运行同一项目的多个实例的情况下,您需要多个项目目录的副本,因为 Vagrant 将盒子状态存储在项目下的.vagrant目录中。

谢谢!只要将带有 Vagrantfile 的目录复制到其他位置即可正常工作。我想上次尝试这样做时我错过了什么。 - timurb
4
请进一步澄清:是否可以从单个Vagrantfile运行多个独立的Vagrant环境,而无需复制它,或者建议为每个环境拥有一个Vagrantfile? - timurb
2
@erthad 哦,我明白了,现在问题更有意义了 :) 是的,在这种情况下,您需要多个相同项目的副本,因为Vagrant将盒子状态存储在项目下的.vagrant目录中。补充回答。 - famousgarkin
1
一种模拟同一目录的多个副本的方法是使用git分支。为每个分支提供自己版本的.vagrant目录,就可以了。如果您需要为自动构建或测试而配置服务器,但需要隔离您的分支,则也可以在CI/CD上使用此方法。 - Stuporman

22
您只需要将包含Vagrantfile的目录复制到新位置,然后从该目录运行vagrant up
确保在首次启动框之前复制目录,否则Vagrant将认为这两个位置指的是同一个框。或者,如果您已经在复制目录之前运行了vagrant up,那么在复制完成后请删除copied_directory/.vagrant

4
很好,是的,如果已经创建了 .vagrant/ 目录,则删除它是关键。 - wired00
1
符号链接也不起作用,因为Vagrant会检测到它们并为所有文件夹创建一个虚拟机。 - VsMaX

17

您甚至可以在同一目录中使用不同的 Vagrantfile 来配置不同的虚拟机或虚拟盒子。

VAGRANT_VAGRANTFILE=Vagrantfile.ubntu_1404_64 VAGRANT_DOTFILE_PATH=.vagrant_ub140464 vagrant up

或者

VAGRANT_VAGRANTFILE=Vagrantfile.ubntu_1404_32 VAGRANT_DOTFILE_PATH=.vagrant_ub140432 vagrant up

两个Vagrantfile可以驻留在同一个目录中


附加说明:在Windows上,显然我们仍然无法针对每个命令设置变量。需要在vagrant up之前运行set <blah>=<blah>。 - shiva

5
我能够使用单个vagrantfile:
Vagrant.configure("2") do |winconfig|
 # stuff
end

Vagrant.configure("2") do |nixconfig|
 # stuff
end

Vagrant.configure("2") do |macconfig|
 # stuff
end

然后我可以使用vagrant up --parallel命令启动它们。正如其他人所提到的,不同的vagrant文件可能更易于维护。


4

1
我在使用Ansible 2 on Windows时遇到了一些问题。当我像这样循环创建盒子时,“vagrant destroy”只能找到上面示例中的3个盒子中的一个。我必须手动在Virtualbox UI中销毁其余的3个盒子。还有其他人遇到过这种情况吗?这是一个错误还是用户错误?但可以确认“硬编码”实例可以按预期工作。 - Charlie
今天我在Windows上使用Virtualbox提供程序使用了这个模式,'vagrant destroy --force'为我销毁了每个节点。在我看来,这是最优雅的解决方案,特别是如果您需要具有类似设置的多个虚拟机。 - Brandon McClure

0

如果虚拟机无法协作,将包含Vagrantfile的目录复制到新位置并在那里启动新机器是最直接的方法。

然而,您可能不想为了版本控制和回溯目的而复制/粘贴VCS脚本。将所有脚本放在一个文件夹中,例如dev,并将Vagrantfile放在dev下的编号文件夹中,例如dev/10。当您创建一个新版本,例如dev/11并且不需要旧版本时,您可以将其删除。并使用相对路径引用通用的配置脚本:

config.vm.provision "shell", path: "../provisioner.sh"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接