原文地址

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”机器。

Vagrant 手册之多个虚拟机 multi-machine的更多相关文章

  1. 区分虚拟机和machine simulator

    1 虚拟机和machine simulator的不同 虚拟机是让多个操作系统同时共用现有的硬件架构,它不会模拟新的硬件架构.qemu这样的模拟器是模拟新的硬件架构,这个架构和host不同.

  2. 虚拟机(Virtual Machine)和容器(Container)的对比

    目前云计算平台常用的虚拟化技术有虚拟机(Virtual Machine)和容器(Container)两种.虚拟机已经是比较成熟的技术,容器技术作为下一代虚拟化技术,国内的各厂商应用还不广,但似乎其代表 ...

  3. Vagrant 手册之 Provisioning - 基本用法

    原文地址 虽然 Vagrant 提供了用于配置虚拟机的多个选项,但是有标准用法,好多知识点对这个 provisioner 是通用的. 配置 首先,Vagrantfile 中配置的每个 provisio ...

  4. Vagrant 手册之网络 - 端口转发

    原文地址 Vagrantfile 配置文件中端口转发的网络标识符:forwarded_port,例如: config.vm.network "forwarded_port", gu ...

  5. 用VirtualBox快速安装虚拟机virtual Machine(Win7+IE10)

    前端测试,经常需要各种环境, 用“Virtual Box + OVA文件”安装虚拟机, 是简单高效的一种方法,可以安装各种window和IE的版本.下面以IE10 + Win7为例说明. 1) 下载和 ...

  6. Vagrant 手册之 Multi-machine 多机器

    原文地址 Vagrant 可以在一个 Vagrantfile 中定义并控制多个虚拟机.这就是"multi-machine"环境. 这些机器可以协同工作或互相关联.multi-mac ...

  7. Vagrant 手册之 Provisioning - file 配置程序

    原文地址 Provisioner 命令:"file" 通过 file 配置程序可以上传宿主机的文件或目录到虚拟机中. 使用场景:将宿主机的 ~/.gitconfig 复制到虚拟机中 ...

  8. Vagrant 手册之 Provisioning - 概述

    原文地址 通过 Vagrant 中的 provisioner 配置程序,可以在使用 vagrant up 启动虚拟机时,在虚拟机上执行安装软件.更改配置等操作. box 通常是通用的,而每个项目总有自 ...

  9. Vagrant 手册之 Provisioning - Shell 配置程序

    原文地址 Provisioner 命令:"shell" 示例: node.vm.provision "shell" do |s| s.inline = < ...

随机推荐

  1. [BZOJ2588]Count on a tree(LCA+主席树)

    题面 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个询问 ...

  2. JS调试分享技巧

    1. 学会使用console.log console.log谁都会用,但是很多同学只知道最简单的console.log(x)这样打印一个对象,当你的代码里面console.log多了之后,会很难将某条 ...

  3. Vue Login by Google

    vue-google-oauth2 来源:https://www.npmjs.com/package/vue-google-oauth2

  4. 模块学习笔记-IR2110/IR2130(上)

    引言 IR2110 / IR2113是高压,高速功率MOSFET和IGBT驱动器,具有独立的高端和低端参考输出通道.逻辑输入与标准CMOS或LSTTL输出兼容,低至3.3V逻辑.浮动通道可用于驱动高端 ...

  5. 2018-11-15-UWP-how-to-get-the-touch-width

    title author date CreateTime categories UWP how to get the touch width lindexi 2018-11-15 18:49:12 + ...

  6. Message相关函数对比

      SendMessage PostMessage  过程类型 同步过程:等待其他程序处理消息完了之后才返回,继续执行 异步过程:只把消息放入队列,不管其他程序是否处理都返回,然后继续执行 返回值 表 ...

  7. html+css+javascript学习记录1

    <p> 最近在学一部分前端,知识点很多,却没怎么系统地应用过,因而理解可能不够深吧.所以我想做点片段似的东西,不懂的再在网上搜一搜,这样可能会更有意思点,所以做了这个记录,希望自己坚持下去 ...

  8. 3.xml的解析

    1.xml的解析原理简介(xml是标记型文档) (1)js使用dom解析标记型文档(html)? - 根据html的层级结构,在内存中分配一个树形结构,把html的标签,属性和文本都封装成对象 - d ...

  9. pycharm安装第三方库失败module 'pip' has no attribute 'main'

    用的pycharm2017.3,新创建一个项目,在安装appium-python-client时报错module 'pip' has no attribute 'main'.通过强大的度娘,知道是pi ...

  10. 迁移数据时 timestamp类型字段报错: 1067 - Invalid default value for 'login_time'

    MySQL数据库升级 8.0.13,原版本5.5:执行导出来的SQL文件时报错 1067 - Invalid default value for 'login_time' 原因:MySQL 5.6以后 ...