原文地址mysql
Vagrant 能夠經過一個 Vagrantfile 定義並控制多個客戶機。這就是所謂的「multi-machine」多虛擬機環境。web
這些機器一般能夠協同工做,或者互相關聯。下面是幾個常見用例:正則表達式
之前,一般是在一臺機器上來模擬運行這樣的複雜環境。不許確。sql
使用 Vagrant 的多客戶機功能,能夠在單個 Vagrant 環境中對這些環境進行建模,而不會失去 Vagrant 的任何好處。shell
多個機器定義在同一個項目的 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.)。
若是你想在多臺機器上應用稍微不一樣的配置,請參閱 [此提示]
在 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 在正斜槓內看到一個機器名稱,會認爲正在使用正則表達式。
爲了促進多機器間的通訊,應使用各類網絡選項。特別是,專用網絡(private network)可用於在多臺機器和主機之間創建專用網絡。
能夠指定一臺主機。當未指定多機環境中的特定機器時,主機將成爲默認機器。
要指定默認機器,只需在定義它時將其標記爲 primary。只能指定一臺主機。
config.vm.define "web", primary: true do |web|
# ...
end
默認狀況下,在多機器環境中,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」機器。