Vagrantfile 文件配置

在我們的開發目錄下有一個檔Vagrantfile,裡面包含有大量的配置資訊,主要包括三個方面的配置,虛擬機器的配置、SSH配置、Vagrant的一些基礎配置。Vagrant是使用Ruby開發的,所以它的配置語法也是Ruby的,但是我們沒有學過Ruby的人還是可以跟著它的注釋知道怎麼配置一些基本項的配置。

config.vm.box = "base"

VirtualBox提供了VBoxManage這個命令列工具,可以讓我們設定VM,用modifyvm這個命令讓我們可以設定VM的名稱和記憶體大小等等,這裡說的名稱指的是在VirtualBox中顯示的名稱,我們也可以在Vagrantfile中進行設定,在Vagrantfile中加入如下這行就可以設定了:

config.vm.provider "virtualbox" do |v|
  v.customize ["modifyvm", :id, "--name", "astaxie", "--memory", "512"]
end

這行設置的意思是調用VBoxManage的modifyvm的命令,設置VM的名稱為astaxie,記憶體為512MB。你可以類似的通過定制其它VM屬性來定制你自己的VM。

網路

Vagrant有兩種方式來進行網路連接:

  • host-only(主機模式),意思是主機和虛擬機器之間的網路互訪,而不是虛擬機器訪問internet的技術,也就是只有你一個人自High,其他人訪問不到你的虛擬機器。
  • Bridge(橋接模式),該模式下的VM就像是局域網中的一台獨立的主機,也就是說需要VM到你的路由器要IP,這樣的話局域網裡面其他機器就可以訪問它了

    一般我們設置虛擬機器都是自high為主,所以我們的設置一般如下:

config.vm.network :private_network, ip: "11.11.11.11"

hostname 設定

設置hostname非常重要,因為當我們有很多台虛擬伺服器的時候,都是依靠hostname來做識別的,例如Puppet或是Chef,都是通過hostname來做識別的。

config.vm.hostname = "go-app"

port 轉接

config.vm.network :forwarded_port, guest: 80, host: 8080

這一行的意思是把對host機器上8080埠的訪問請求forward到虛擬機器的80埠的服務上,例如你在你的虛擬機器上使用nginx跑了一個Go應用,那麼你在host機器上的流覽器中打開http://localhost:8080時,Vagrant就會把這個請求轉發到VM裡面跑在80埠的nginx服務上,因此我們可以通過這個設置來幫助我們去設定host和VM之間,或是VM和VM之間的資訊交互。

目錄設定

我們上面介紹過/vagrant目錄預設就是當前的開發目錄,這是在虛擬機器開啟的時候默認掛載同步的。我們還可以通過配置來設置額外的同步目錄:第一個參數是主機的目錄,第二個參數是虛擬機器掛載的目錄

config.vm.synced_folder  "/Users/astaxie/data", "/vagrant_data"

修改完Vagrantfile的配置後,記得要用vagrant reload命令來重啟VM之後才能使用VM更新後的配置。

建立多機器的分散式系統

Vagrant.configure("2") do |config|
  config.vm.define :web do |web|
    web.vm.provider "virtualbox" do |v|
          v.customize ["modifyvm", :id, "--name", "web", "--memory", "512"]
    end
    web.vm.box = "base"
    web.vm.hostname = "web"
    web.vm.network :private_network, ip: "11.11.1.1"
  end

  config.vm.define :db do |db|
    db.vm.provider "virtualbox" do |v|
          v.customize ["modifyvm", :id, "--name", "db", "--memory", "512"]
    end
    db.vm.box = "base"
    db.vm.hostname = "db"
    db.vm.network :private_network, ip: "11.11.1.2"
  end
end

這裡的設置和前面我們單機設置配置類似,只是我們使用了:web以及:db分別做了兩個VM的設置,並且給每個VM設置了不同的hostname和IP,設置好之後再使用vagrant up將虛擬機器跑起來。之後,我們就可以通過vagrant ssh登錄虛擬機器了,但是這次和上次使用的不一樣了,這次我們需要指定相應的角色,用來告訴ssh你期望連接的是哪一台:

$ vagrant ssh web
vagrant@web:~$

$ vagrant ssh db
vagrant@db:~$

其他命令:

// 列出所擁有的Box
$>vagrant box list

// Vagrantfile 異動後要執行
$>vagrant provision

// 更改vagrantfile的設定後,記得要用vagrant reload的指令重開VM讓VM可以用新的設定檔跑起來
$>vagrant reload