Vagrant使用與入門技巧詳解

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


1.1 項目初始化shell

Vagrant使用Vagrant文件做爲配置文件,該文件中定義了項目的根目錄,Vagrant的不少配置都是基於這個配置的根目錄進行的,同時,該文件也描述了項目運行所須要的機器類型以及其它資源(好比安裝哪些軟件等)。
要初始化一個Vagrant項目,使用命令vagrant init命令,使用該命令後,會在當前目錄建立一個名爲Vagrantfile的配置文件,修改該文件改變Vagrant項目的行爲。apache

$ mkdir vagrant_getting_started
$ cd vagrant_getting_started
$ vagrant initbootstrap

Vagrant使用盒子(box)建立開發環境,所謂的盒子就是一個已經配置好的基礎的虛擬機鏡像,Vagrant避免了每次建立項目都去從新建立虛擬機,而是按照Vagrantfile文件的配置從基礎鏡像建立這個Box。
能夠在已經存在的項目上使用vagrant init命令,該命令只會建立配置文件,並不會對原有項目形成影響。若是須要,能夠將該配置文件Vagrantfile加入到項目的版本控制中,這樣團隊中的其它開發者就能夠快速的創建起開發環境已進行運行調試了。
在建立Vagrant項目的時候,首先須要作的是添加一個Box,經過使用命令vagrant box add添加一個盒子,Vagrant網站上提供了不少其它開發者共享的Box,咱們能夠直接複用,在Vagrant Cloud上能夠查找你須要的Box而且添加到本地。centos

$ vagrant box add chef/centos-6.5bash

添加的盒子是能夠被多個項目同時使用的,項目在初始化Box的時候並不會修改添加的基礎Box,而是克隆一份Box的副本,在副本上進行配置。
添加盒子以後,咱們須要配置項目使用這個盒子做爲基礎,修改Vagrantfile文件:網絡

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

注意: 若是這裏指定的box沒有添加過,則Vagrant會自動去下載該Box。tcp

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"

相關文章
相關標籤/搜索