Vagrant 手册之多个虚拟机 multi-machine
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 web 或 vagrant ssh db。
其他命令(如 vagrant up)默认在每台机器上运行。所以如果你运行 vagrant up 命令,Vagrant 会启动 web 和 DB 两个机器。也可以通过 vagrant up web 或 vagrant 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的更多相关文章
- 区分虚拟机和machine simulator
1 虚拟机和machine simulator的不同 虚拟机是让多个操作系统同时共用现有的硬件架构,它不会模拟新的硬件架构.qemu这样的模拟器是模拟新的硬件架构,这个架构和host不同.
- 虚拟机(Virtual Machine)和容器(Container)的对比
目前云计算平台常用的虚拟化技术有虚拟机(Virtual Machine)和容器(Container)两种.虚拟机已经是比较成熟的技术,容器技术作为下一代虚拟化技术,国内的各厂商应用还不广,但似乎其代表 ...
- Vagrant 手册之 Provisioning - 基本用法
原文地址 虽然 Vagrant 提供了用于配置虚拟机的多个选项,但是有标准用法,好多知识点对这个 provisioner 是通用的. 配置 首先,Vagrantfile 中配置的每个 provisio ...
- Vagrant 手册之网络 - 端口转发
原文地址 Vagrantfile 配置文件中端口转发的网络标识符:forwarded_port,例如: config.vm.network "forwarded_port", gu ...
- 用VirtualBox快速安装虚拟机virtual Machine(Win7+IE10)
前端测试,经常需要各种环境, 用“Virtual Box + OVA文件”安装虚拟机, 是简单高效的一种方法,可以安装各种window和IE的版本.下面以IE10 + Win7为例说明. 1) 下载和 ...
- Vagrant 手册之 Multi-machine 多机器
原文地址 Vagrant 可以在一个 Vagrantfile 中定义并控制多个虚拟机.这就是"multi-machine"环境. 这些机器可以协同工作或互相关联.multi-mac ...
- Vagrant 手册之 Provisioning - file 配置程序
原文地址 Provisioner 命令:"file" 通过 file 配置程序可以上传宿主机的文件或目录到虚拟机中. 使用场景:将宿主机的 ~/.gitconfig 复制到虚拟机中 ...
- Vagrant 手册之 Provisioning - 概述
原文地址 通过 Vagrant 中的 provisioner 配置程序,可以在使用 vagrant up 启动虚拟机时,在虚拟机上执行安装软件.更改配置等操作. box 通常是通用的,而每个项目总有自 ...
- Vagrant 手册之 Provisioning - Shell 配置程序
原文地址 Provisioner 命令:"shell" 示例: node.vm.provision "shell" do |s| s.inline = < ...
随机推荐
- C#中Func与Action的理解
Action 与 Func是.NET类库中增加的内置委托,以便更加简洁方便的使用委托.最初使用委托时,均需要先定义委托类型,然后定义一个符合委托类型签名的函数,在调用前,需声明并创建委托对象,将指定函 ...
- java_第一年_JavaWeb(12)
SimpleTag标签 定义了五个方法:setJspContext.setJspBody.setParent和getParent以及最重要的doTag方法(完成了所有的业务逻辑): setJspCon ...
- P1828 香甜的黄油 (spfa)
[题目描述] 农夫John知道每只奶牛都在各自喜欢的牧场(一个牧场不一定只有一头牛).给出各头牛在的牧场和牧场间的路线,找出使所有牛到达的路程和最短的牧场(他将把糖放在那). [题目链接] https ...
- FB相关
1.传包过程的错误 (中文提示)游戏必须通过我们的 CDN 引用我们支持的 SDK (英文提示)Games must reference one of our supported SDKs via o ...
- 问题 D: 小k的硬币问题
问题 D: 小k的硬币问题 时间限制: 1 Sec 内存限制: 128 MB提交: 21 解决: 5[提交] [状态] [命题人:jsu_admin] 题目描述 小k和小p一起玩一个游戏,有n堆硬 ...
- RocksDB存储引擎测试
一:安装搭建(两个节点都要安装) yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-r ...
- javascript事件触发器fireEvent和dispatchEvent
javascript事件触发器fireEvent和dispatchEvent 事件触发器就是用来触发某个元素下的某个事件,IE下fireEvent方法,高级浏览器(chrome,firefox等) ...
- 20191115PHP cookie登入实例
首先是登入页面 <form action="" method="post"> <input type="text" nam ...
- 自己实现一个Redux
Redux是一个可预测的状态容器,提供可预测的状态管理. 什么是状态?状态其实也就是数据,管理状态也就是对数据的管理.那么什么是可预测的状态管理呢?能够监听数据的变化,获取变化的来源,在发生变化时可以 ...
- CSS高度坍塌原因及解决办法
在文档流中,父元素的高度默认是被子元素撑开的,也就是子元素多高,父元素就多高. 但是当为子元素设置浮动以后,子元素会完全脱离文档流,此时将会导致子元素无法撑起父元素的高度,导致父元素的高度塌陷.由于父 ...