Vagrant 手册之多个虚拟机 multi-machine

原文地址mysql

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

这些机器一般能够协同工做,或者互相关联。下面是几个常见用例:正则表达式

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

之前,一般是在一台机器上来模拟运行这样的复杂环境。不许确。sql

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

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.)apache

并且重要的是,你能够继续使用配置对象。配置对象在特定于机器的配置以前加载并合并,就像 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”机器。

相关文章
相关标签/搜索