歡迎光臨
每天分享高質量文章

Vagrant 入門指南

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


致謝
轉載自 | https://blog.csdn.net/qianghaohao/article/details/80038096
 作者 | Qhh0205

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[1],該公司主要做一些開源軟體,相關的產品還有 Packer[2]Consul[3]Vault[4]Nomad[5] 等。

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[8] 下載速度特別慢,所以在此提供一下該 box 的百度網盤下載地址,加速下載:https://pan.baidu.com/s/1wJCeWEyxKQLVPi1IH1IlYg

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

  1. haohao $ cd /Users/haohao

  2. haohao $ mkdir vagrant

2、新增前面下載的 box

新增 box 命令格式:

  1. vagrant box add box 名稱> <box 檔案>

◈ 本地 box 名稱:自定義名稱,該名稱是本地 vagrant 管理時使用的名稱;
◈ box 檔案:前面下載的 vagrant box 檔案或者遠端 box url 地址;
  1. haohao $ vagrant box add ubuntu-server-16.04 ubuntu-server-16.04-amd64-vagrant.box

  2. ==> box: Box file was not detected as metadata. Adding it directly...

  3. ==> box: Adding box 'ubuntu-server-16.04' (v0) for provider:

  4.    box: Unpacking necessary files from: file:///Users/haohao/vagrant/ubuntu-server-16.04-amd64-vagrant.box

  5. ==> box: Successfully added box 'ubuntu-server-16.04' (v0) for 'virtualbox'!

3、檢視 box 是否新增成功

檢視當前 vagrant 中有哪些 box:

  1. haohao $ vagrant box list

  2. ubuntu-server-16.04 (virtualbox, 0)

4、初始化上面新增的 box

初始化命令格式:

  1. vagrant init box 名稱>

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

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

  1. haohao $ vagrant init 'ubuntu-server-16.04'

  2. A `Vagrantfile` has been placed in this directory. You are now

  3. ready to `vagrant up` your first virtual environment! Please read

  4. the comments in the Vagrantfile as well as documentation on

  5. `vagrantup.com` for more information on using Vagrant.

5、啟動虛擬機器

虛擬機器啟動命令:

  1. vagrant up

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

  1. haohao $ vagrant up

  2. Bringing machine 'default' up with 'virtualbox' provider...

  3. ==> default: Importing base box 'ubuntu-server-16.04'...

  4. ==> default: Matching MAC address for NAT networking...

  5. ==> default: Setting the name of the VM: vagrant_default_1524288099752_62326

  6. ==> default: Clearing any previously set network interfaces...

  7. .....

  8. ==> default: Mounting shared folders...

  9.    default: /vagrant => /Users/haohao/vagrant

6、連線虛擬機器

  1. haohao $ vagrant ssh

  2. Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-98-generic x86_64)

  3. * Documentation:  https://help.ubuntu.com

  4. * Management:     https://landscape.canonical.com

  5. * Support:        https://ubuntu.com/advantage

  6.  Get cloud support with Ubuntu Advantage Cloud Guest:

  7.    http://www.ubuntu.com/business/services/cloud

  8. 0 packages can be updated.

  9. 0 updates are security updates.

  10. Last login: Sat Apr 21 05:28:37 2018 from 10.0.2.2

  11. haohao $

7、檢視 Vagrant 共享目錄

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

  1. haohao $ df -h

  2. Filesystem      Size  Used Avail Use% Mounted on

  3. udev            490M     0  490M   0% /dev

  4. tmpfs           100M  3.1M   97M   4% /run

  5. /dev/sda1       9.7G  857M  8.8G   9% /

  6. tmpfs           497M     0  497M   0% /dev/shm

  7. tmpfs           5.0M     0  5.0M   0% /run/lock

  8. tmpfs           497M     0  497M   0% /sys/fs/cgroup

  9. vagrant         234G   49G  185G  21% /vagrant

  10. tmpfs           100M     0  100M   0% /run/user/1000

  11. # ls 檢視該共享目錄內容和宿主機內容一致

  12. haohao $ ls /vagrant/

  13. ubuntu-xenial-16.04-cloudimg-console.log  Vagrantfile

Vagrant 配置檔案淺析

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

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

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

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

1. box 名稱設定

  1. config.vm.box = "base"

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

2、VM 相關配置

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

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

  1. config.vm.provider "virtualbox" do |v|

  2.  v.customize ["modifyvm", :id, "--name", "ubuntu", "--memory", "1024"]

  3. end

3、網路設定

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

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

4、hostname 設定

hostname 的設定非常簡單:

  1. config.vm.hostname = "kubernetes"

5、目錄共享

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

  1. # 第一個引數是主機的目錄,第二個引數是虛擬機器掛載的目錄

  2. config.vm.synced_folder  "/Users/haohao/data", "/vagrant_data"

6、埠轉發

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

  1. 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 啟動:

  1. Vagrant.configure("2") do |config|

  2.  config.vm.define :web do |web|

  3.    web.vm.provider "virtualbox" do |v|

  4.          v.customize ["modifyvm", :id, "--name", "web", "--memory", "512"]

  5.    end

  6.    web.vm.box = "ubuntu-server-16.04"

  7.    web.vm.hostname = "web"

  8.    web.vm.network :private_network, ip: "11.11.1.1"

  9.  end

  10.  config.vm.define :db do |db|

  11.    db.vm.provider "virtualbox" do |v|

  12.          v.customize ["modifyvm", :id, "--name", "db", "--memory", "512"]

  13.    end

  14.    db.vm.box = "ubuntu-server-16.04"

  15.    db.vm.hostname = "db"

  16.    db.vm.network :private_network, ip: "11.11.1.2"

  17.  end

  18. 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

贊(0)

分享創造快樂

© 2024 知識星球   網站地圖