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"
 
新聞熱點
疑難解答