原文地址

Vagrant 可以通过一个 Vagrantfile 定义并控制多个客户机。这就是所谓的“multi-machine”多虚拟机环境。

这些机器通常可以协同工作,或者互相关联。下面是几个常见用例:

  • 准确建模多服务器生产拓扑环境,例如分离 Web 和数据库服务器。
  • 建模分布式系统,以及它们如何相互交互。
  • 测试一个接口,比如一个 API 到一个服务组件。
  • 灾难情况测试:机器宕机,网络分区,网络缓慢,环境不一致(inconsistent world views)等。

以前,通常是在一台机器上来模拟运行这样的复杂环境。不准确。

使用 Vagrant 的多客户机功能,可以在单个 Vagrant 环境中对这些环境进行建模,而不会失去 Vagrant 的任何好处。

1. 定义多个机器

多个机器定义在同一个项目的 Vagrantfile 文件中,使用 config.vm.define 方法调用。这个配置指令挺有趣的,因为它可以在一个配置中创建 Vagrant 配置。例如:

Vagrant.configure("2") do |config|
  config.vm.provision "shell", inline: "echo Hello"

  config.vm.define "web" do |web|
    web.vm.box = "apache"
  end

  config.vm.define "db" do |db|
    db.vm.box = "mysql"
  end
end

config.vm.define 是一个包含另一个变量的块。这个变量,比如上面的 web 变量,和配置变量完全相同,但是内部变量使用的任何配置只适用于被定义的机器。因此,web 上的任何配置只会影响 web 这个机器。(As you can see, config.vm.define takes a block with another variable. This variable, such as web above, is the exact same as the config variable, except any configuration of the inner variable applies only to the machine being defined. Therefore, any configuration on web will only affect the web machine.)

而且重要的是,你可以继续使用配置对象。配置对象在特定于机器的配置之前加载并合并,就像 Vagrantfile 加载顺序 中的其他 Vagrantfile 一样。

如果你熟悉编程,这就类似语言中的不同的变量作用域。

在使用这些作用域时,执行顺序(例如 provision 的顺序)变得重要。Vagrant 按照 Vagrantfile 中列出的顺序执行外部输入。例如,使用下面的 Vagrantfile:

Vagrant.configure("2") do |config|
  config.vm.provision :shell, inline: "echo A"

  config.vm.define :testing do |test|
    test.vm.provision :shell, inline: "echo B"
  end

  config.vm.provision :shell, inline: "echo C"
end

这种情况下的提供者 provisioner 将输出“A”,然后输出“C”,然后输出“B”。 注意“B”是最后一个。这是因为排序是按照文件中的顺序排序(That is because the ordering is outside-in, in the order of the file.)。

如果你想在多台机器上应用稍微不同的配置,请参阅 [此提示]

2. 控制多个机器

在 Vagrantfile 中定义了多台机器时,各种 vagrant 命令的用法稍有变化。

只有单个机器(如 vagrant ssh)才有意义的命令现在需要机器的名称来控制。使用上面的例子,变为 vagrant ssh webvagrant ssh db

其他命令(如 vagrant up)默认在每台机器上运行。所以如果你运行 vagrant up 命令,Vagrant 会启动 web 和 DB 两个机器。也可以通过 vagrant up webvagrant up db 命令启动特定机器。

此外,可以指定一个正则表达式来仅匹配某些机器。这在指定很多类似机器的情况下很有用,例如,如果正在测试一个分布式服务,可能有一个 leader 机器以及 follower0,follower1,follower2 等。如果想启动所有 follower,而不是 leader,可以做 vagrant up /follower[0-9]/。如果 Vagrant 在正斜杠内看到一个机器名称,会认为正在使用正则表达式。

3. 机器之间通信

为了促进多机器间的通信,应使用各种网络选项。特别是,专用网络(private network)可用于在多台机器和主机之间建立专用网络。

4. 指定主机

可以指定一台主机。当未指定多机环境中的特定机器时,主机将成为默认机器。

要指定默认机器,只需在定义它时将其标记为 primary。只能指定一台主机。

config.vm.define "web", primary: true do |web|
  # ...
end

5. 自动启动机器

默认情况下,在多机器环境中,vagrant up 将启动所有定义的机器。自动启动设置允许你告诉 Vagrant 不启动特定机器。例:

config.vm.define "web"
config.vm.define "db"
config.vm.define "db_follower", autostart: false

当使用上述设置运行 vagrant 时,Vagrant 将自动启动“web”和“db”机器,但不会启动“db_follower”。可以通过运行 vagrant up db_follower 手动强制启动“db_follower”机器。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐