2014年2月23日 星期日

解放開發環境建置之原罪 - Vagrant 網路設定篇 / Network Settings

前言


* 先前已撰寫一「解放開發環境建置之原罪 - Vagrant」,該文簡介如何利用 Vagrant 建立多個虛擬機器。

這些虛擬機器都是利用 NAT 搭配 Port forwarding 的方式,與外面網路進行溝通(換句話說,與虛擬機器之間的溝通都是透過 HOST/DOMAIN0,並非直接與虛擬機器連線溝通)。如果我們想要不透過 Port forwarding 的方式直接與虛擬機器連線溝通,就需要讓虛擬機器使用 Public/Private IP,或者我們想創造一個只有虛擬機器間可相互溝通但與外界隔絕的環境,我們就必須設定所謂的內部網路(internal network),這些都可以在 Vagrantfile 中進行設定,以建立我們所需要的各種環境。
以下就逐一介紹各種環境的設置方法。


以 DHCP 方式取得 Public IP


* 使用 DHCP 方式取得 Public IP 必須在各位的實體網路環境內設有動態指派 IP 位址的 DHCP 伺服器,否則虛擬機器將無法取得 Public IP。

* 我們沿用之前的 Vagrantfile 範例
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
   
    # 設定各虛擬機器都是以 bash 環境來執行
    config.ssh.shell = "bash -c 'BASH_ENV=/etc/profile exec bash'"
    
    # 建立一台名為 web 的虛擬機器
    config.vm.define "web" do |web|
    
        # 該虛擬機器是以 wheezy32-o 當基底
        web.vm.box = "{wheezy32-o}"
       
        # 建立完機器後,我們可將細部設定寫在 web.sh,vagrant 透過 provision 會將設定套用在 web 機器上
        web.vm.provision :shell, :path => "/home/user/vagrant_demo/web.sh"
       
        # 以 DHCP 方式取得 Public IP
        web.vm.network "public_network"
       
    end
     
    # 建立一台名為 sql 的虛擬機器
    config.vm.define "sql" do |sql|
     
        # 該虛擬機器是以 wheezy32-o 當基底
        sql.vm.box = "{wheezy32-o}"
       
        # 建立完機器後,我們可將細部設定寫在 sql.sh,vagrant  透過 provision 會將設定套用在 sql 機器上
        sql.vm.provision :shell, :path => "/home/user/vagrant_demo/sql.sh"
       
        # 以DHCP 方式取得 Public IP
        sql.vm.network "public_network"
       
    end
     
    # virtualbox 相關設定
    config.vm.provider :virtualbox do |vb|
        
        # 讓虛擬機器得以 gui 方式運行
        vb.gui = true
        
    end
      
end 
* 從範例中我們了解到只要在虛擬機器設定的區塊中加入 <your_vmname>.vm.network "public_network" 這段設定,則此虛擬機器會以 DHCP 的方式自動取得 Public IP。

* 接著,我們只要用 vagrant ssh <your_vmname> 進入虛擬機器內查詢其 IP 即可。


直接指定 Public IP 位置給虛擬機器


* 此功能不需有 DHCP 伺服器,而是由我們直接指定一個 Public IP 給虛擬機器

* 我們同樣沿用之前的 Vagrantfile 範例
  
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
   
    # 設定各虛擬機器都是以 bash 環境來執行
    config.ssh.shell = "bash -c 'BASH_ENV=/etc/profile exec bash'"
    
    # 建立一台名為 web 的虛擬機器
    config.vm.define "web" do |web|
    
        # 該虛擬機器是以 wheezy32-o 當基底
        web.vm.box = "{wheezy32-o}"
       
        # 建立完機器後,我們可將細部設定寫在 web.sh,vagrant 透過 provision 會將設定套用在 web 機器上
        web.vm.provision :shell, :path => "/home/user/vagrant_demo/web.sh"
       
        # 直接指定 Public IP 位置給虛擬機器
        web.vm.network "public_network", ip: "xxx.xxx.xxx.xxx"
       
    end
     
    # 建立一台名為 sql 的虛擬機器
    config.vm.define "sql" do |sql|
     
        # 該虛擬機器是以 wheezy32-o 當基底
        sql.vm.box = "{wheezy32-o}"
       
        # 建立完機器後,我們可將細部設定寫在 sql.sh,vagrant  透過 provision 會將設定套用在 sql 機器上
        sql.vm.provision :shell, :path => "/home/user/vagrant_demo/sql.sh"
       
        # 直接指定 Public IP 位置給虛擬機器
        sql.vm.network "public_network", ip: "ooo.ooo.ooo.ooo"
       
    end
     
    # virtualbox 相關設定
    config.vm.provider :virtualbox do |vb|
        
        # 讓虛擬機器得以 gui 方式運行
        vb.gui = true
        
    end
      
end
* 從範例中我們了解到只要在虛擬機器設定的區塊中加入 <your_vmname>.vm.network "public_network", ip: "xxx.xxx.xxx.xxx" 這段設定,vagrant 就可直接指定 Public IP 位置給虛擬機器囉。


Private IP 設定方式


* 若各位以充分了解上面講述 Public IP 的設定方式,相信您應該也猜到 Private IP 是如何設定的。其實呢,只要將上面所提到有關於 public 的地方通通改成 private ,即可以 Private IP 配置給虛擬機器。是不是很簡單呢?


建立只允許虛擬機器相互溝通的隔離環境


* 在一些特定情況下,我們可能會需要一個只允許虛擬機器間相互溝通,並與外面網路甚至是外部實體機都隔離的環境。若有此需求,我們可使用內部網路(internal network)來達成我們的目的。(note: 本篇文章是用 virtualbox 為虛擬機器的 controller)
不廢話,我們直接從範例下手!
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
   
    # 設定各虛擬機器都是以 bash 環境來執行
    config.ssh.shell = "bash -c 'BASH_ENV=/etc/profile exec bash'"
    
    # 建立一台名為 web 的虛擬機器
    config.vm.define "web" do |web|
    
        # 該虛擬機器是以 wheezy32-o 當基底
        web.vm.box = "{wheezy32-o}"
       
        # 建立完機器後,我們可將細部設定寫在 web.sh,vagrant 透過 provision 會將設定套用在 web 機器上
        web.vm.provision :shell, :path => "/home/user/vagrant_demo/web.sh"
       
        # 直接指定 Private IP 位置給虛擬機器
        web.vm.network "private_network", ip: "xxx.xxx.xxx.xxx"
       
        # 設定此機器加入名為 vboxnet0 的 internal network
        virtualbox__intnet: "vboxnet0"
       
    end
     
    # 建立一台名為 sql 的虛擬機器
    config.vm.define "sql" do |sql|
     
        # 該虛擬機器是以 wheezy32-o 當基底
        sql.vm.box = "{wheezy32-o}"
       
        # 建立完機器後,我們可將細部設定寫在 sql.sh,vagrant  透過 provision 會將設定套用在 sql 機器上
        sql.vm.provision :shell, :path => "/home/user/vagrant_demo/sql.sh"
       
        # 直接指定 Private IP 位置給虛擬機器
        sql.vm.network "private_network", ip: "ooo.ooo.ooo.ooo"
       
        # 設定此機器加入名為 vboxnet0 的 internal network
        virtualbox__intnet: "vboxnet0"
       
    end
     
    # virtualbox 相關設定
    config.vm.provider :virtualbox do |vb|
        
        # 讓虛擬機器得以 gui 方式運行
        vb.gui = true
        
    end
      
end 
* 從上述範例中,可以看到只要在虛擬機器設定的區塊中加入 virtualbox__intnet: "<the_name_of_internal_network>",即可讓虛擬機器加入內部網路中喔!


參考資料:
http://www.vagrantup.com/

沒有留言: