Vagrant 手册之 Multi-machine 多机器
原文地址Vagrant 可以在一个 Vagrantfile 中定义并控制多个虚拟机。这就是“multi-machine”环境。这些机器可以协同工作或互相关联。multi-machine 的常见用例有:准确建模多服务器生产拓扑,例如分离 Web 和数据库服务器。建模分布式系统,以及它们如何相互交互。测试接口,比如一个到服务组件的 API。灾难情况测试:机器正在死亡,网络分区,网络...
Vagrant 可以在一个 Vagrantfile 中定义并控制多个虚拟机。这就是“multi-machine”环境。
这些机器可以协同工作或互相关联。multi-machine 的常见用例有:
- 准确建模多服务器生产拓扑,例如分离 Web 和数据库服务器。
- 建模分布式系统,以及它们如何相互交互。
- 测试接口,比如一个到服务组件的 API。
- 灾难情况测试:机器正在死亡,网络分区,网络速度慢,不一致(inconsistent world views)等。
注意,这只是生产环境的不准确模型,其行为可能有很大不同。
使用 Vagrant 的多机功能,可以在单个 Vagrant 环境中对这些环境进行建模。
定义多个机器
通过 config.vm.define
方法调用可以在一个 Vagrantfile 中定义多个机器,这个指令可以在配置中创建 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,与 config 变量完全相同,除了内部变量的任何配置只适用于被定义的机器。因此,web 上的任何配置只会影响 web 机器。
重要的是,可以继续使用 config 对象。config 对象在特定于机器的配置之前加载并合并,就像 Vagrantfile 加载顺序中的其他 Vagrantfile 一样。
这类似语言如何具有不同的变量作用域。
在使用时,provisioner 等的执行顺序变得重要。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”。这是因为执行顺序是由外而内。
如果需要在多个机器上使用略有不同的配置,参考 这个知识点。
控制多个机器
在 Vagrantfile 中定义了多台机器时,各种命令的用法稍有变化。
只有作用在单个机器上(如 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 在正斜杠内看到机器名称,则会认为正在使用正则表达式。
机器之间通信
为了促进多机设置中机器间的通信,应使用各种网络选项。特别是,private 网络可用于在多台机器和主机之间建立 private 网络。
指定主机器
可以指定一台主机器。当未指定多机环境中的特定机器时,主机器将成为默认机器。
要指定默认机器,只需在定义它时通过 primary: true
将其标记为主。只能指定一台主机器。
config.vm.define "web", primary: true do |web|
# ...
end
自动启动机器
默认情况下,在多机器环境中,vagrant up
将启动所有定义的机器。autostart 选项可以告诉 Vagrant 不启动特定机器。例:
config.vm.define "web"
config.vm.define "db"
config.vm.define "db_follower", autostart: false
使用上面的设置运行 vagrant up
时,Vagrant 会自动启动 web 和 db 两个机器,但是不会启动 db_follower。可以通过 running vagrant up db_follower
手动启动。
更多推荐
所有评论(0)