Vagrant 入門指南

Qhh0205發表於2018-04-28

Vagrant 入門指南

Vagrant 簡介

Vagrant 是一個用來構建和管理虛擬機器環境的工具。Vagrant 有著易於使用的工作流,並且專注於自動化,降低了開發者搭建環境的時間,提高了生產力。解決了“在我的機器上可以工作”的問題。

Vagrant 是為了方便的實現虛擬化環境而設計的,使用 Ruby 開發,基於 VirtualBox 等虛擬機器管理軟體的介面,提供了一個可配置、輕量級的行動式虛擬開發環境。使用 Vagrant 可以很方便的就建立起來一個虛擬環境,而且可以模擬多臺虛擬機器,這樣我們平時還可以在開發機模擬分散式系統。

團隊新員工加入,常常會遇到花一天甚至更多時間來從頭搭建完整的開發環境,而有了 Vagrant,只需要直接將已經打包好的 package(裡面包括開發工具,程式碼庫,配置好的伺服器等)拿過來就可以工作了,這對於提升工作效率非常有幫助。

為什麼選擇 Vagrant

Vagrant 提供了一個易於配置,可重複使用,相容的環境,透過一個單一的工作流程來控制,幫助你和團隊最大化生產力和靈活性。 為了實現 Vagrant 的魔力,Vagrant 站在了巨人的肩膀上。虛擬機器的配置基於 VirtualBox,VMware,AWS 或者其他提供商。然後一些配置工具,比如 shell 指令碼,Chef 或者 Puppet 可以自動化地在虛擬機器安裝並配置軟體。

對於開發者人員

如果你是一個開發者,Vagrant 將在一個一次性的、一致的環境中隔離依賴項及其配置,而不會影響你習慣使用的任何工具(編輯器、瀏覽器、偵錯程式等)。一旦你或者其他人建立了一個 Vagrantfile,你只需要執行 vagrant up 所有的東西就自動安裝和配置了。你團隊中的其他成員使用同一個配置檔案來建立開發環境,因此不管你工作在 Linux,MacOS X 還是 Windows, 所有團隊的成員都可以在統一的環境環境中執行程式碼,這樣就可以避免“在我的機器上可以工作”的問題。

對於運維人員

如果你是一個運維工程師或者 DevOps 工程師,Vagrant 給予你一個一次性的環境來開發和測試基礎架構管理指令碼。你可以使用本地虛擬機器(比如 VirtualBox 或者 VMware)馬上測試一些東西,比如 shell 指令碼、Chef cookbooks、Puppet 模組等。然後,你可以用同樣的配置在遠端雲上,比如 AWS 或者 RackSpace,來測試這些指令碼。拋棄之前自定義指令碼來回收 EC2 例項吧,停止使用 SSH 在各種機器之間跳來跳去,請開始使用 Vagrant 來給你的工作帶來更多便利。

Vagrant 和 Terraform 的區別

Vagrant 和 Terraform 都出自同一個公司 HashiCorp,該公司主要做一些開源軟體,相關的產品還有 PackerConsulVaultNomad 等。

Terraform 的主要用途是管理雲提供商的遠端資源,比如 AWS。Terraform 可以管理橫跨多個雲提供商巨量的基礎設施。而 Vagrant 主要用來管理僅使用少量虛擬機器的本地開發環境。

Vagrant 用於開發環境,Terraform 普遍用於基礎設施管理。

VirtualBox 安裝

VirtualBox 是 Oracle 開源的虛擬化系統,和 VMware 是同類產品,支援多個平臺,可以到官方網站:https://www.virtualbox.org/wiki/Downloads 下載適合你平臺的 VirtualBox 最新版本並安裝。

提示:對於 Mac 使用者,如果系統為 OSX 10.13.3(mac OS High Sierra) 或者更高版本,安裝過程可能會失敗,報錯提示安裝失敗,安裝器遇到了一個錯誤導致安裝失敗...,原因是新版本 Mac 系統的安全機制阻止外部核心擴充套件安裝,導致安裝失敗。兩種解決方法:
1. 進入系統偏好設定 > 安全性與隱私 > 通用,然後手動允許;
2. 在終端敲命令停用此安全特性:sudo spctl --master-disable

Vagrant 安裝

到官方網站下載相應系統平臺的安裝包:http://www.vagrantup.com/downloads.html
直接根據嚮導進行操作即可完成安裝,安裝完後就可以在終端輸入 vagrant 命令了。

提示:儘量下載最新的程式,因為 VirtualBox 經常升級,升級後有些介面會變化,老的 Vagrant 可能無法使用。

Vagrant 啟動第一臺虛擬機器

到此準備工作(VirtualBox 和 Vagrant 安裝)基本上做完了,接下來就可以透過 Vagrant 來啟動一臺虛擬機器了。

在啟動虛擬機器之前先簡單介紹下 Vagrant box,box 是一個打包好的作業系統,是一個字尾名為 .box 的檔案,其實是一個壓縮包,裡面包含了 Vagrant 的配置資訊和 VirtualBox 的虛擬機器映象檔案。vagrant up 啟動虛擬機器是基於 box 檔案的,因此在啟動虛擬機器前必須得把 box 檔案準備好。或者也可以在啟動的時候指定遠端 box 地址,在這裡我把 box 檔案下載下來,然後啟動時指定該檔案。

我使用網上分享的 ubuntu-server-16.04 這個 box,由於vagrant 官方 box 下載速度特別慢,所以在此提供一下該 box 的百度網盤下載地址,加速下載:https://pan.baidu.com/s/1wJCeWEyxKQLVPi1IH1IlYg

1、新建一個目錄作為 Vagrant 的工程目錄

haohao $ cd /Users/haohao
haohao $ mkdir vagrant

2、新增前面下載的 box

新增 box 命令格式:

vagrant box add <本地 box 名稱> <box 檔案>
  • 本地 box 名稱:自定義名稱,該名稱是本地 vagrant 管理時使用的名稱;
  • box 檔案:前面下載的 vagrant box 檔案或者遠端 box url 地址;
haohao $ vagrant box add ubuntu-server-16.04 ubuntu-server-16.04-amd64-vagrant.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'ubuntu-server-16.04' (v0) for provider:
    box: Unpacking necessary files from: file:///Users/haohao/vagrant/ubuntu-server-16.04-amd64-vagrant.box
==> box: Successfully added box 'ubuntu-server-16.04' (v0) for 'virtualbox'!

3、檢視 box 是否新增成功

檢視當前 vagrant 中有哪些 box:

haohao $ vagrant box list
ubuntu-server-16.04 (virtualbox, 0)

4、初始化上面新增的 box

初始化命令格式:

vagrant init <本地 box 名稱>

本地 box 名稱:第 2 步中新增的 box 名稱

這裡初始化前面新增的 box,初始化後會在當前目錄生產一個 Vagrantfile 檔案,裡面包含了虛擬機器的各種配置,關於具體每個配置項是什麼意思,後面會介紹。

haohao $ vagrant init 'ubuntu-server-16.04'
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

5、啟動虛擬機器

虛擬機器啟動命令:

vagrant up

啟動虛擬機器時會自動將當前目錄(即 Vagrantfile 檔案所在目錄),和虛擬機器的 /vagrant 目錄共享。

haohao $ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'ubuntu-server-16.04'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: vagrant_default_1524288099752_62326
==> default: Clearing any previously set network interfaces...
.....
==> default: Mounting shared folders...
    default: /vagrant => /Users/haohao/vagrant

6、連線虛擬機器

haohao $ vagrant ssh
Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-98-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.

Last login: Sat Apr 21 05:28:37 2018 from 10.0.2.2
haohao $

7、檢視 Vagrant 共享目錄

進入虛擬機器後執行 df -h 可以看到 Vagrant 預設把宿主機 Vagrantfile 所在的目錄和虛擬機器的 /vagrant 目錄共享,可以透過 ls /vagrant/ 檢視該目錄內容,內容和宿主機對應目錄一致。

haohao $ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            490M     0  490M   0% /dev
tmpfs           100M  3.1M   97M   4% /run
/dev/sda1       9.7G  857M  8.8G   9% /
tmpfs           497M     0  497M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           497M     0  497M   0% /sys/fs/cgroup
vagrant         234G   49G  185G  21% /vagrant
tmpfs           100M     0  100M   0% /run/user/1000

# ls 檢視該共享目錄內容和宿主機內容一致
haohao $ ls /vagrant/
ubuntu-xenial-16.04-cloudimg-console.log  Vagrantfile

Vagrant 配置檔案淺析

前面我們執行 vagrant init <本地 box 名稱> 會在當前目錄生成 Vagrantfile 檔案,這個檔案是非常重要的,一般給別人共享自己的環境時都是提供一個 Vagrantfile 和一個 box 檔案,這樣就可以很輕鬆地將環境共享給別人,別人能得到一模一樣的統一的環境,這就是使用 Vagrant 的好處。

Vagrantfile 主要包括三個方面的配置,虛擬機器的配置、SSH配置、Vagrant 的一些基礎配置。Vagrant 是使用 Ruby 開發的,所以它的配置語法也是 Ruby 的,對於沒有學過 Ruby 的朋友也沒關係,根據例子模仿下就會了。

修改完配置後需要執行 vagrant reload 重啟 VM 使其配置生效。

以下簡單介紹下常用配置的配置項:

1. box 名稱設定

config.vm.box = "base"

上面這配置展示了 Vagrant 要去啟用那個box作為系統,也就是前面我們輸入 vagrant init <本地 box 名稱>時所指定的 box,如果沒有輸入 box 名稱的話,那麼預設就是 base

2、VM 相關配置

VirtualBox 提供了 VBoxManage 這個命令列工具,可以讓我們設定 VM,用modifyvm這個命令讓我們可以設定 VM 的名稱和記憶體大小等等,這裡說的名稱指的是在 VirtualBox 中顯示的名稱,我們也可以在 Vagrantfile 中進行設定,舉例如下:

呼叫 VBoxManage 的 modifyvm 的命令,設定 VM 的名稱為 ubuntu,記憶體為 1024 MB。你可以類似的透過定製其它 VM 屬性來定製你自己的 VM。

config.vm.provider "virtualbox" do |v|
  v.customize ["modifyvm", :id, "--name", "ubuntu", "--memory", "1024"]
end

3、網路設定

Vagrant 有兩種方式來進行網路連線,一種是 host-only (主機模式),這種模式下所有的虛擬系統是可以互相通訊的,但虛擬系統和真實的網路是被隔離開的,虛擬機器和宿主機是可以互相通訊的,相當於兩臺機器透過雙絞線互聯。另一種是 Bridge(橋接模式),該模式下的 VM 就像是區域網中的一臺獨立的主機,可以和區域網中的任何一臺機器通訊,這種情況下需要手動給 VM 配 IP 地址,子網掩碼等。我們一般選擇 host-only 模式,配置如下:

config.vm.network :private_network, ip: "11.11.11.11"

4、hostname 設定

hostname 的設定非常簡單:

config.vm.hostname = "kubernetes"

5、目錄共享

我們前面介紹過/vagrant目錄預設就是當前的開發目錄,這是在虛擬機器開啟的時候預設掛載同步的。我們還可以透過配置來設定額外的同步目錄:

# 第一個引數是主機的目錄,第二個引數是虛擬機器掛載的目錄
config.vm.synced_folder  "/Users/haohao/data", "/vagrant_data"

6、埠轉發

對宿主機器上 8080 埠的訪問請求 forward 到虛擬機器的 80 埠的服務上:

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

Vagrant 常用命令清單

  • vagrant box add 新增 box
  • vagrant init 初始化 box
  • vagrant up 啟動虛擬機器
  • vagrant ssh 登入虛擬機器
  • vagrant box list 列出 Vagrant 當前 box 列表
  • vagrant box remove 刪除相應的 box
  • vagrant destroy 停止當前正在執行的虛擬機器並銷燬所有建立的資源
  • vagrant halt 關機
  • vagrant package 把當前的執行的虛擬機器環境進行打包為 box 檔案
  • vagrant plugin 安裝解除安裝外掛
  • vagrant reload 重新啟動虛擬機器,重新載入配置檔案
  • vagrant resume 恢復被掛起的狀態
  • vagrant ssh-config 輸出用於 ssh 連線的一些資訊
  • vagrant status 獲取當前虛擬機器的狀態
  • vagrant suspend 掛起當前的虛擬機器
  • vagrant up 重啟虛擬機器

Vagrant 啟動虛擬機器叢集

前面我們都是透過一個 Vagrantfile 配置啟動單臺機器,如果我們要啟動一個叢集,那麼可以把需要的節點在一個 Vagrantfile 寫好,然後直接就可以透過 vagrant up 同時啟動多個 VM 組成一個叢集。以下示例配置一個 web 節點和一個 db 節點,兩個節點在同一個網段,並且使用同一個 box 啟動:

Vagrant.configure("2") do |config|
  config.vm.define :web do |web|
    web.vm.provider "virtualbox" do |v|
          v.customize ["modifyvm", :id, "--name", "web", "--memory", "512"]
    end
    web.vm.box = "ubuntu-server-16.04"
    web.vm.hostname = "web"
    web.vm.network :private_network, ip: "11.11.1.1"
  end

  config.vm.define :db do |db|
    db.vm.provider "virtualbox" do |v|
          v.customize ["modifyvm", :id, "--name", "db", "--memory", "512"]
    end
    db.vm.box = "ubuntu-server-16.04"
    db.vm.hostname = "db"
    db.vm.network :private_network, ip: "11.11.1.2"
  end
end

相關連線

  • https://www.vagrantup.com/intro/index.html
  • https://blog.csdn.net/rickiyeat/article/details/55097687
  • https://github.com/astaxie/go-best-practice/blob/master/ebook/zh/01.0.md