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」機器。

相關文章
相關標籤/搜索