1. 程式人生 > >Vagrant使用與入門技巧詳解

Vagrant使用與入門技巧詳解

Vagrant是一個基於Ruby的工具,用於建立和部署虛擬化開發環境。它 使用Oracle的開源VirtualBox虛擬化系統,使用 Chef建立自動化虛擬環境了,安裝方法是非常的簡單的,下面一起來看看Vagrant使用與入門技巧.

1.1 專案初始化

Vagrant使用Vagrant檔案作為配置檔案,該檔案中定義了專案的根目錄,Vagrant的很多配置都是基於這個配置的根目錄進行的,同時,該檔案也描述了專案執行所需要的機器型別以及其它資源(比如安裝哪些軟體等)。
要初始化一個Vagrant專案,使用命令vagrant init命令,使用該命令後,會在當前目錄建立一個名為Vagrantfile的配置檔案,修改該檔案改變Vagrant專案的行為。

$ mkdir vagrant_getting_started
$ cd vagrant_getting_started
$ vagrant init

Vagrant使用盒子(box)建立開發環境,所謂的盒子就是一個已經配置好的基礎的虛擬機器映象,Vagrant避免了每次建立專案都去重新建立虛擬機器,而是按照Vagrantfile檔案的配置從基礎映象建立這個Box。
可以在已經存在的專案上使用vagrant init命令,該命令只會建立配置檔案,並不會對原有專案造成影響。如果需要,可以將該配置檔案Vagrantfile加入到專案的版本控制中,這樣團隊中的其它開發者就可以快速的建立起開發環境已進行執行除錯了。
在建立Vagrant專案的時候,首先需要做的是新增一個Box,通過使用命令vagrant box add新增一個盒子,Vagrant網站上提供了很多其它開發者共享的Box,我們可以直接複用,在Vagrant Cloud上可以查詢你需要的Box並且新增到本地。

$ vagrant box add chef/centos-6.5

新增的盒子是可以被多個專案同時使用的,專案在初始化Box的時候並不會修改新增的基礎Box,而是克隆一份Box的副本,在副本上進行配置。
新增盒子之後,我們需要配置專案使用這個盒子作為基礎,修改Vagrantfile檔案:

Vagrant.configure("2") do |config|
  config.vm.box = "chef/centos-6.5"
end

注意: 如果這裡指定的box沒有新增過,則Vagrant會自動去下載該Box。

1.2 啟動並執行專案

在配置完成後,就可以啟動該虛擬環境了,使用命令vagrant up啟動開發環境。

$ vagrant up

啟動之後,我們可以使用ssh連線到該虛擬機器上:

$ vagrant ssh

現在你已經連線到該虛擬機器上了,你可以像操作普通Linux系統一樣做你希望做的事情。
注意的是,在該虛擬機器上進行rm -fr /操作的時候請謹慎一些,因為在該虛擬機器中,掛載了/vagrant目錄,該目錄是與你主機的專案共享的,刪除的話會將專案刪除掉。
在該虛擬機器使用完成後,如果不再需要了,可以使用vagrant destroy命令移除該虛擬機器。
提示: 預設配置下,虛擬機器中的/vagrant目錄與主機上的專案目錄是同一個目錄,該目錄中的所有操作都會自動同步。

1.3 建立專案初始化指令碼

每次初始化系統的時候都需要重新安裝軟體是一件非常麻煩的事,因此,Vagrant提供了一種簡單的方式來幫我們完成這個過程,在建立虛擬機器的時候可以指定自動執行指令碼。
在專案目錄下建立一個bootstrap.sh的指令碼檔案:

#!/usr/bin/env bash

apt-get update
apt-get install -y apache2
rm -rf /var/www
ln -fs /vagrant /var/www

該指令碼是在Ubuntu環境下使用的,如果你是用的Box是CentOS,則不能使用apt-get命令了,而應該使用yum命令完成程式的安裝。

接下來,我們需要配置Vagrantfile檔案,讓其在建立環境的時候自動執行該指令碼。

Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/precise32"
  config.vm.provision :shell, path: "bootstrap.sh"
end

這樣配置之後,使用命令vagrant up啟動虛擬機器的時候,該指令碼就會自動執行,完成虛擬機器的初始化了。
如果你的虛擬機器已經處於執行狀態了,可以通過使用命令vagrant reload --provision快速的重新啟動虛擬機器,命令中的--provision告訴Vagrant在重啟的時候執行provisioners的配置,通常情況下,provisioners的配置只在執行vagrant up命令的時候才會執行。

1.4 網路配置

Vagrant提供了埠轉發功能,通過將虛擬機器中的埠對映到主機的不同埠,我們可以在主機中使用對映後的埠訪問虛擬機器中的服務。
例如:
Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/precise32"
  config.vm.provision :shell, path: "bootstrap.sh"
  config.vm.network :forwarded_port, host: 4567, guest: 80
end

使用如上配置啟動虛擬機器之後,就可以在主機上使用http://127.0.0.1:4567訪問虛擬機器上的Apache提供的Web服務了。

1.5 Teardown(虛擬機器解除安裝)

當你希望切換到其它專案上開發或者是當你要出去吃午飯,你下班了的情況下,你需要清理一下你的開發環境,這個時候,Vagrant提供了三種方式,它們各有各自的優缺點,因此,你需要自己去權衡你希望採用哪種方式。
Suspending (掛起) 執行命令vagrant suspend將會儲存當前虛擬機器的執行狀態並且停止它,跟主機掛起是一樣的,當你需要再次啟動的時候,使用vagrant up命令將會恢復之前的執行狀態。這種方式的優點是,啟動很迅速,可以很快進入開發環境中,缺點是會佔用比較多的磁碟空間,因為虛擬機器將記憶體中的資料都儲存到了磁碟上。
Halting(停止) 這種方式是正常的停止虛擬機器,使用虛擬機器的關閉命令完成,當需要重新使用的時候使用命令vagrant up重新啟動虛擬機器,該方法與計算機冷啟動一樣,缺點是啟動的時候耗時比較多,依然佔用部分磁碟空間。
Destroying(銷燬) 該方式將會銷燬虛擬機器,不會再佔用磁碟空間,下次啟動的時候將會重新建立開發環境,包括下載軟體等等。


Vagrant使用技巧

1.1 如何除錯

在使用Vagrant過程中,難免會出現一些不穩定的因素而造成一些使用上的bug,因此,Vagrant提供了Debug日誌的方式用於除錯,可以方便的查詢錯誤的原因,以便快速解決問題。
要允許啟用日誌功能,需要在主機上設定環境變數VAGRANT_LOG為需要的日誌級別,包含debug, info, warn, error。當你需要查詢錯誤產生的原因的時候,通常使用日誌級別info,這種情況下你可以得到包含重要資訊的比較乾淨的日誌。

在Linux和Mac系統上,你可以通過下面的方式設定:

$ VAGRANT_LOG=info vagrant up

在Windows下,你需分開寫:

$ set VAGRANT_LOG=info
$ vagrant up

當然,你也可以不用這種方式,只需要在啟動的時候增加引數--debug即可。

$ vagrant up --debug

1.2 如何使用外掛

Vagrant中提供了很多可以直接使用的外掛,使用這些外掛,可以極大的減少配置開發環境的工作量,Vagrant的大部分核心功能都是基於外掛實現的。
Vagrant使用命令vagrant plugin install安裝外掛。

$ vagrant plugin install vagrant-example-plugin

外掛安裝完成後,將會在Vagrant啟動的時候自動載入,如果外掛載入過程中出現錯誤,不會影響Vagrant的啟動,而是會輸出外掛載入失敗的錯誤資訊。
外掛安裝完成後,你應該檢視外掛開發文件獲取如何使用該外掛,一般可以通過vagrant命令使用外掛的命令,如果外掛提供了provision的話,可以通過config.vm.provision進行配置。
外掛的更新比較簡單,使用命令vagrant plugin update即可更新全部外掛,使用vagrant plugin update NAME可以更新指定外掛。
外掛解除安裝使用命令vagrant plugin uninstall。

$ vagrant plugin uninstall vagrant-example-plugin

檢視安裝了哪些外掛:

vagrant plugin list

1.3 如何配置網路

在Vagrant中,所有的網路配置都在Vagrantfile中的config.vm.network方法中。

Vagrant.configure("2") do |config|
  # other config here

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

每一種網路型別都有一個識別符號如:forwarded_port,它後面跟著一串配置選項。在埠跳轉的例子中,提供了兩個引數,虛擬機器中的埠號和主機中對映的埠號。
如果需要多個網路配置,使用多個config.vm.network即可。
如何進行埠跳轉
埠跳轉功能允許你通過TCP或者是UDP直接訪問主機上的指定埠,該埠的請求會被轉發到虛擬機器上的指定埠。
Vagrant.configure("2") do |config|
  config.vm.network "forwarded_port", guest: 80, host: 8080
end

上面的配置將會主機上對8080埠的訪問轉發到虛擬機器上的80埠。

下面是該配置(forwarded_port)支援的引數:

guest (int) 希望暴漏給主機的虛擬機器埠
guest_ip(string) 希望繫結的IP,該IP與guest指定的埠暴漏給主機,預設為空,所有網絡卡介面。
host(int) 希望使用來訪問虛擬機器的guest埠的主機埠號
host_ip(string) 主機的IP地址,用於繫結到跳轉的埠,如果不指定,則使用所有IP。
protocol(string) 可選tcp或者udp,預設為tcp.
Vagrant.configure("2") do |config|
  config.vm.network "forwarded_port", guest: 2003, host: 12003, protocol: 'tcp'
  config.vm.network "forwarded_port", guest: 2003, host: 12003, protocol: 'udp'
end

1.4 如何配置同步目錄

使用config.vm.synced_folder方法配置同步目錄。

Vagrant.configure("2") do |config|
  # other config here

  config.vm.synced_folder "src/", "/srv/website"
end

以上配置中,synced_folder方法的第一個引數為主機上要跟虛擬機器同步的目錄,第二個引數為要掛載到虛擬機器上的路徑。

可以配置引數disabled: true禁止目錄同步。

Vagrant.configure("2") do |config|
config.vm.synced_folder "src/", "/srv/website", disabled: true
end

預設情況下,Vagrant設定同步資料夾的屬主/組為SSH使用者,如果需要修改的話,使用下面配置:

config.vm.synced_folder "src/", "/srv/website",
  owner: "root", group: "root"