[轉] Vagrant入門

[From] https://www.cnblogs.com/davenkin/p/vagrant-virtualbox.htmlhtml

 

簡單地說,Vagrant讓咱們能夠經過代碼的方式快速地、可重複地建立針對不一樣虛擬環境的虛擬機,包括Virtualbox、AWS、Docker等。它使得咱們能夠一次性地、自動建立多個環境相同的虛擬機,對於軟件開發和測試尤爲有用。本文咱們將以Virtualbox爲例,看看Vagrant的基本使用。web

 

 

 

這是一個關於Vagrant的學習系列,包含以下文章:shell

  1. Vagrant入門
  2. 建立本身的Vagrant box 
  3. 用Vagrant搭建Jenkins構建環境
  4. 用Vagrant和Ansible搭建持續交付平臺

 

(一)快速入門ubuntu

首先須要建立一個目錄用於存放Vagrantfile文件以及Vagrant在工做中的數據:服務器

mkdir my-vagrant-project
cd my-vagrant-project

 

而後初始化Vagrant工程:網絡

vagrant init ubuntu/trusty64

 

該命令會在當前目錄下建立Vagrantfile,而且指定所使用的box爲ubuntu/trusty64,該box由Hashicorp官網提供。此時,Vagrant發現box的名字的格式爲「用戶名/box名」,則會使用「https://atlas.hashicorp.com/用戶名/box名」來下載該box。對於非官網提供的box,能夠經過如下命令建立:ssh

vagrant init my-box https://boxes.company.com/my.box

 

其中,my-box爲該box的名字,後面的URL爲該box的下載地址。接下來就能夠啓動虛擬機了:ide

vagrant up

 

此時Vagrant會先從Hashicorp下載ubuntu/trusty64這個box(若是先前下載過了則跳過),而後啓動虛擬機。在默認狀況下,Virtualbox將做爲provider,固然你也可使用其餘provider,好比如下命令將啓動一個hyperv虛擬機:工具

vagrant up --provider hyperv

 

登陸到虛擬機:學習

vagrant ssh

 

此時vagrant將使用默認的用戶vagrant以及預設的SSH公鑰密鑰鍵值對直接登陸虛擬機。

 

關閉虛擬機:

vagrant halt

 

刪除虛擬機:

vagrant destroy

 

請注意,vagrant destroy只會刪除虛擬機自己,也即你在Virtualbox將看不到該虛擬機,可是不會刪除該虛擬機所使用的box。

 

Vagrant還會在Vagrantfile所在同級目錄下建立一個.vagrant隱藏文件夾,該文件夾包含了在本地運行虛擬機的一些信息。若是使用了代碼庫管理(好比Git),這個.vagrant文件夾應該被ignore掉。

 

(二)添加和查看所下載的box

 Vagrant會將所下載的box保存到~/.vagrant.d/boxes目錄下,除了在執行「vagrant up」時Vagrant會下載box外,你也能夠單獨下載box到本地:

vagrant box add ubuntu/trusty64

 

這將從Hashicorp官網上下載ubuntu/trusty64這個box,你也能夠指定一個另外的URL:

vagrant box add --name mybox http://someurl.com/ubuntu.box

 

這裏的mybox是一個邏輯名字,你能夠用該名字來設置Vangrantfile的「config.vm.box」。

你能夠在任什麼時候候向Vagrant中添加新的box以備後用,在執行vagrant up時,Vagrant首先檢查本地是有存在所須要的box,若是有則直接使用,若是沒有則下載。

 

列出本地全部的box:

vagrant box list

 

刪除某個box:

vagrant box remove box-name

 

(三)端口轉發(Port Forwarding)

在默認狀況下,Vagrant所建立的Virtualbox虛擬機使用的是NAT網絡類型,即外界是不能直接訪問你的虛擬機的,就連Host機器也訪問不了。此時,若是你在虛擬機中啓動的一個Tomcat來部署網站的測試環境,而又想外界可以訪問的話,你須要使用端口轉發:

Vagrant.configure("2") do |config|
  config.vm.network "forwarded_port", guest: 8080, host: 8888
end

 

以上代碼將Host機的8888端口轉發到了虛擬機的8080端口,這樣你即可以經過在Host機上訪問http://localhost:8888來訪問虛擬機的Tomcat了。對於Virtualbox來講,只有NAT類型的網絡類型支持端口轉發,這也是爲何Vagrant建立的Virtualbox虛擬機默認都有一個支持NAT的虛擬網卡,緣由就是要可以支持Vagrant級別的端口轉發。另外,Vagrant在第一次嘗試鏈接虛擬機時使用的也是NAT。

 

(四)共享文件夾

在默認狀況下,Vagrant所建立的虛擬機已經爲咱們建立了一個共享文件夾,在虛擬機上是/home/vagrant目錄,在Host機上則爲Vagrantfile所在目錄,固然你也能夠額外添加另外的共享文件夾:

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

 

第一個參數爲Host機器上的目錄,第二個參數爲虛擬機上的目錄。

 

 (五)Provision

簡單地說,Provision即經過使用某些工具自動地、批量地爲機器安裝軟件以及配置系統,它省去了人工安裝和配置系統時的重複性和易錯性,固然還享受了計算機與生俱來的速度。Vagrant提供多種方式對虛擬機進行Provision,包括Shell、Chef、Puppet和Ansible等。以Shell爲例,既能夠經過直接在Vagrantfile中編寫Shell腳本的方式,也能夠經過引用外部Shell文件的方式。

 

直接在Vagrantfile中編寫Shell腳本,能夠經過「inline」指定腳本內容:

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

  config.vm.provision "shell", inline: "echo hello"
end

 

 經過引用外部腳本文件的方式:

Vagrant.configure("2") do |config|
  config.vm.provision "shell", path: "script.sh"
end

 

在使用Ansible時,有兩種方式:(1)在Host機器上安裝Ansible,(2)採用Ansible Local的方式,即在虛擬機自身上安裝Ansible。對於第(1)種方法,咱們須要保證Host機器上已經安裝了Ansible,而後進行配置:

複製代碼
Vagrant.configure("2") do |config|

  #
  # Run Ansible from the Vagrant Host
  #
  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "playbook.yml"
  end

end
複製代碼

 

在使用第(2)種方法時,Vagrant會首先檢查box中是否已經安裝了Ansible,若是沒有,則會自動安裝到虛擬機上,而後再運行provision:

複製代碼
Vagrant.configure("2") do |config|
  # Run Ansible from the Vagrant VM
  config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "playbook.yml"
  end
end
複製代碼

 

當咱們屢次執行「vagrant up」啓動虛擬機時,provison並不會每次都執行,只有在這三種狀況下provision纔會運行:

  1. 首次執行vagrant up
  2. 執行vagrant provision
  3. 執行vagrant reload --provision

 

固然,你也能夠在Vagrantfile中配置成每次執行vagrant up時都運行provision:

Vagrant.configure("2") do |config|
  config.vm.provision "shell", inline: "echo hello",
    run: "always"
end

 

(六)網絡配置

在默認狀況下,對於Virtualbox而言,Vagrant將使用Virtualbox的NAT網絡方式,這種方式容許虛擬機訪問外部網絡,可是不容許外界訪問虛擬機,就連Host機器也訪問不了。另外,咱們能夠爲虛擬機配置private network和public network。在配置private network時,至關於虛擬機和Host機共同組成了一個單獨的局域網,外界沒法訪問該局域網,可是虛擬機能夠訪問外界,Host機和虛擬機之間也能夠互訪。請注意,這裏說的外界是指本來和Host處於同一局域網的其餘機器。

 

使用private network時,咱們能夠給虛擬機指定固定的私有IP:

Vagrant.configure("2") do |config|
  config.vm.network "private_network", ip: "192.168.50.4"
end

 

固然也可使用DHCP的方式動態分配IP:

Vagrant.configure("2") do |config|
  config.vm.network "private_network", type: "dhcp"
end

 

對於Virtualbox而言,此時虛擬機其實有兩張網卡在工做,一種是Vagrant默認建立的NAT網卡,另外一種是Host only類型的網卡提供private network。

 

在使用public network時,虛擬機和Host在網絡中具備同等的地位(共同使用Host機的物理網卡與外界通訊),就至關於在Host所在網絡中又多了一臺計算機同樣,此時虛擬機可使用網絡中的DHCP服務器得到與Host處於同一個網段的IP地址,如下配置默認採用DHCP方式配置public network:

Vagrant.configure("2") do |config|
  config.vm.network "public_network"
end

 

若是Host機器有多張網卡,此時運行vagrant up, Vagrant會詢問須要使用那張網卡鏈接到網絡,若是不想要這種交互,則能夠在Vagrantfile中進行配置:

config.vm.network "public_network", bridge: [
  "en1: Wi-Fi (AirPort)",
]

這裏的 Wi-Fi(AirPort)表示使用了Mac筆記本的Airport鏈接到Wi-Fi。

 

除了DHCP,也可使用靜態IP:

Vagrant.configure("2") do |config|
  config.vm.network "public_network", ip: "192.168.0.5"
end

 

(七)Provider特定配置

不一樣的Provider有不一樣的特性,也存在不一樣的配置方式。以Virtualbox爲例,Vagrant默認會給虛擬機指定一個不具有可讀性的名字,好比my-vagrant-project_default_1471685053487_94837,咱們能夠對此進行配置予以更改:

config.vm.provider "virtualbox" do |v|
  v.name = "my_vm"
end

 

Provider的特定配置也能夠覆蓋Vagrant原來的配置:

複製代碼
Vagrant.configure("2") do |config|
  config.vm.box = "precise64"

  config.vm.provider "vmware_fusion" do |v, override|
    override.vm.box = "precise64_fusion"
  end
end
複製代碼

 

 在下一篇中,咱們將講到如何建立本身的Vagrant box 

相關文章
相關標籤/搜索