Vagrant 在本地快速建立機(jī)器并初始化

一、Vagrant 介紹

Vagrant 是一個(gè)軟件,可以自動化虛擬機(jī)的安裝和配置流程,用來管理虛擬機(jī),如 VirtualBox、VMware、AWS 等目前市面上個(gè)人 PC 的主流操作系統(tǒng)不是Windows 就是 MacOS。對于這些用戶,如果需要用 Linux 環(huán)境進(jìn)行開發(fā)或?qū)W習(xí),使用虛擬機(jī)無疑是最方便的選擇。主要好處是可以提供一個(gè)可配置、可移植和復(fù)用的軟件環(huán)境,可以使用 shell、chef、puppet 等工具部署。所以 vagrant 不能單獨(dú)使用,如果你用它來管理自己的開發(fā)環(huán)境的話,必須在自己的電腦里安裝了虛擬機(jī)軟件,如 virtualbox。

更進(jìn)一步,Vagrant 提供一個(gè)命令行工具 vagrant,通過這個(gè)命令行工具可以直接啟動一個(gè)虛擬機(jī),當(dāng)然你需要提前定義一個(gè) Vagrantfile 文件,這有點(diǎn)類似Dockerfile 之于 docker了??梢酝ㄟ^編寫一個(gè) Vagrantfile 來控制虛擬機(jī)的啟動、虛擬機(jī)網(wǎng)絡(luò)環(huán)境的配置、虛擬機(jī)與主機(jī)間的文件共享,以及啟動后自動執(zhí)行一些配置腳本,比如自動執(zhí)行一個(gè) shell script 來安裝一些必備的開發(fā)工具,如Mysql。這意味著,當(dāng)你需要在多臺機(jī)器間同步開發(fā)進(jìn)度時(shí),只需要同步Vagrantfile,就可以保證各臺機(jī)器擁有一致的開發(fā)環(huán)境。另外,即便對于計(jì)算機(jī)小白用戶,Vagrant也是一個(gè)利器。以前我們?yōu)榱藢W(xué)習(xí)一門語言,必須先手動安裝這門語言的編譯環(huán)境。有了 Vagrant后,我們可以下載別人寫好的 Vagrantfile,然后運(yùn)行 vagrant up,vagrant 就會自動下載虛擬機(jī)鏡像,自動加載鏡像并配置虛擬機(jī),然后交給我們一個(gè)即開即用的學(xué)習(xí)環(huán)境。

二、 安裝與使用

Vagrant 既然是配置虛擬機(jī),那么自然需要虛擬機(jī)程序和被虛擬的操作系統(tǒng)鏡像(Image)。前者常用的選擇有 VirtualBox 和 VMWare,后者則包括 Ubuntu、FreeBSD 等等。Vagrant 稱前者為 provider,稱后者為 box。原則上,我們可以自由搭配 provider 和 box,但由于 VirtualBox 開源且免費(fèi),Vagrant將其作為默認(rèn)的 provider。所以,一般會先安裝 VirtualBox,再安裝Vagrant。

我這里在 mac 上做測試,直接使用官方的安裝包來安裝 Vagrant
https://www.vagrantup.com/downloads.html

使用 VirtualBox

本文將使用 VirtualBox 作為虛擬機(jī)管理器(providers),因?yàn)樗敲赓M(fèi)的、適用于各大平臺,且在 Vagrant 已集成。
可以通過下面的命令啟動運(yùn)行一個(gè)虛擬機(jī)

$ vagrant init hashicorp/precise32
$ vagrant up

在執(zhí)行以上兩條命令后, 將擁有一臺運(yùn)行在 VirtualBox 下的 Ubuntu 12.04 LTS 32位 虛擬機(jī)。 我們可以通過 vagrant ssh 命令來 SSH 登錄到這臺虛擬機(jī)上,當(dāng)用完以后,可以通過 vagrant destroy 命令來銷毀所有的使用痕跡。

項(xiàng)目建立

在創(chuàng)建使用 Vagrant 的第一步,就是對 Vagrantfile 配置文件進(jìn)行配置。Vagrantfile 配置文件的作用有兩個(gè)方面:

  1. 設(shè)置項(xiàng)目的根目錄,很多 Vagrant 的配置都是與根目錄有緊密關(guān)系。

  2. 指定在項(xiàng)目中所需的虛擬機(jī)類型及資源,例如需要安裝哪些軟件以及在哪里可以訪問到這些資源。

Vagrant 有一個(gè)內(nèi)置的命令來初始化一個(gè)目錄作為 Vagrant 項(xiàng)目的根目錄: vagrant init

$ mkdir vagrant
$ cd vagrant
$ vagrant init

上面這些命令會創(chuàng)建一個(gè) Vagrantfile 文件在當(dāng)前的目錄,可以打開 Vagrantfile 配置文件查看一下,內(nèi)容包含了注釋說明及實(shí)例。


image.png

也可以在已存在的項(xiàng)目目錄中執(zhí)行 vagrant init 命令,來設(shè)置一個(gè)已存在的項(xiàng)目

Boxes

Vagrant 是通過基礎(chǔ)鏡像包來實(shí)現(xiàn)快速克隆創(chuàng)建虛擬機(jī)的。這些基礎(chǔ)鏡像包在 Vagrant 中被稱為 boxes , 而在創(chuàng)建 Vagrantfile 文件后的第一件事情就是指定 Vagrant 環(huán)境使用哪一個(gè) Box。

$ vagrant box add hashicorp/precise32

Boxes 是通過 vagrant box add 命令來添加到 Vagrant 中的。這將從 HashiCorp's Atlas box catalog 這個(gè)專門用來存放 boxes 的地方下載一個(gè)名叫 "hashicorp/precise32" 的 box。不但可以從 HashiCorp's Atlas 下載 boxes,其外還可以從本地文件、自定義 URL 等方式添加 boxes。

已經(jīng)添加了的 boxes 可以被多個(gè)項(xiàng)目重復(fù)使用。每個(gè)項(xiàng)目其實(shí)是從 box 克隆并初始化出一個(gè)鏡像,不會對原有的 box 基礎(chǔ)鏡像進(jìn)行任何修改。所以,當(dāng)兩個(gè)項(xiàng)目都使用了 hashicorp/precise32 這個(gè) box,在其中一個(gè)項(xiàng)目虛擬機(jī)中添加了文件,不會對另外一個(gè)項(xiàng)目中的虛擬機(jī)造成任何影響。

image.png

上面可以看到已經(jīng)將 box 添加到了 Vagrant 中,我們需要對我們的項(xiàng)目進(jìn)行配置,才能將這個(gè)項(xiàng)目作為我們今后的基礎(chǔ)環(huán)境。打開 Vagrantfile 文件,對其內(nèi)容依照以下進(jìn)行編輯:

Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/precise32"
end

"hashicorp/precise32" 這個(gè)名字必須和你前面添加進(jìn)去的 box 名稱相同。 Vagrant 是根據(jù)這個(gè)名字去判斷進(jìn)行哪種操作的。如果你之前沒有添加過 box,當(dāng)你運(yùn)行 Vagrant 時(shí)它會根據(jù)這個(gè)名字自動下載并添加該 box 進(jìn)來。

啟動和登錄

啟動使用如下命令:

$ vagrant up

一分鐘之內(nèi),這個(gè)命令會執(zhí)行完畢,我們將擁有一個(gè)運(yùn)行 Ubuntu 的虛擬機(jī)。但是我們無法真實(shí)地看到任何變化,因?yàn)?Vagrant 在運(yùn)行時(shí)沒有提供 UI 界面。為了證實(shí) Vagrant 已經(jīng)正確地運(yùn)行,你可以通過 SSH 登錄到虛擬機(jī)中查看:
剛開始啟動我的一直有報(bào)錯(cuò)如下:


image.png

后面查閱資料貌似是一個(gè)bug,我將本地的virtualbox 升級到 5.2.18 之后,重啟reload 解決

$ vagrant ssh

這個(gè)命令會進(jìn)入一個(gè)完整的 SSH 會話,可以繼續(xù)與虛擬機(jī)進(jìn)行交互,也可以進(jìn)行任何你想做的操作。雖然這個(gè)環(huán)境可能是臨時(shí)的,但輕易不要執(zhí)行 rm -rf / 命令,因?yàn)?Vagrant 共享了一個(gè) /vagrant 目錄,這個(gè)目錄是存放在宿主機(jī)上的(具體在宿主機(jī)在哪個(gè)路徑是由 Vagrantfile 文件中設(shè)置的),如果執(zhí)行了這個(gè)命令,也將刪除了宿主機(jī)上的這個(gè)目錄。當(dāng)這臺虛擬機(jī)不想再使用的時(shí)候, 在宿主機(jī)器上執(zhí)行 vagrant destroy 命令,Vagrant 就會刪除所有數(shù)據(jù)及痕跡。
vagrant ssh $name ,如果主機(jī)上就一個(gè)vagrant可以不指定名字。默認(rèn)進(jìn)入的用戶是vagrant。


image.png
與宿主機(jī)同步目錄

默認(rèn)情況下,Vagrant 共享項(xiàng)目根路徑(注意,這個(gè)可在 Vagrantfile 中配置)到你宿主機(jī)的 /vagrant 目錄中。 再次執(zhí)行 vagrant up 命令,SSH 登錄到虛擬機(jī)中查看,發(fā)現(xiàn)與宿主機(jī)的 vagrant 根目錄相同:


image.png

再次 touch 文件 驗(yàn)證:


image.png

因此,Vagrant 是保持了虛擬機(jī)與宿主機(jī)間這個(gè)目錄的同步的。
有了 /Vagrant 這個(gè)同步目錄,我們可以繼續(xù)在宿主機(jī)上使用慣用的編輯器進(jìn)行開發(fā),文件則會自動同步至虛擬機(jī)中。
Provision 軟件安裝

這一步相當(dāng)于自動執(zhí)行“安裝各類軟件”、“調(diào)整系統(tǒng)設(shè)置”等步驟。其實(shí),這一步的操作結(jié)果可以被打包到 box 中,從而完全避免 Provision。比如,我們既可以在Provision 中安裝Python,也可以直接將一個(gè)已經(jīng)安裝好 Python 的系統(tǒng)打包為box,然后使用該 box 創(chuàng)建虛擬機(jī)。兩種方式各有優(yōu)劣,顯然前者更靈活、更輕量。畢竟,不是所有打包到box中的功能都為用戶所需。使用 Provision 可以最大限度的“按需定制”。

在這一步,Vagrant會可能需要調(diào)用第三方的 Provision System,比如Chef、Puppet。而最基本的Provision可以通過shell script來指定,反映在Vagrantfile中,便是如下的代碼:

Vagrant.configure("2") do |config|
...
config.vm.provision "shell", inline: "echo Hello, World"
config.vm.provision "shell", path: "script.sh"
...
end
其中,inline表示script直接寫在Vagrantfile中,而path則表示script被寫在指定的文件中。

Provision可以說是自動裝機(jī)的核心步驟,Vagrant則提供了一個(gè)方便的接口。
可以在 Vagrantfile 中定義要安裝的軟件和操作,例如我們安裝 Apache。
在與Vagrantfile同級的目錄下創(chuàng)建一個(gè)bootstrap.sh文件。

#!/usr/bin/env bash

apt-get update
apt-get install -y apache2
if ! [ -L /var/www ]; then
  rm -rf /var/www
  ln -fs /vagrant /var/www
fi

然后在 Vagrantfile 中使用它。

Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/precise64"
  config.vm.provision :shell, path: "bootstrap.sh"
end

"provision" 這一行告訴 Vagrant 使用 shell provisioner 去啟動機(jī)器并使用bootstrap.sh。
加入

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

可以做網(wǎng)絡(luò)端口轉(zhuǎn)發(fā),然后執(zhí)行 vagrant reload 或者 vagrant up 可以生效。如果之前已經(jīng)在 running了,則使用 vagrant reload --provision 可以快速 restart 而跳過 initial。


image.png

image.png

訪問本地的 4567 端口,可以看到之前寫進(jìn)腳本的均已成功顯示:


image.png
Share

我們做的 vagrant 是可以分享給別人的用的,只要有一個(gè) hashicorp 賬號,vagrant login 后就可以執(zhí)行 vagrant share 分享,會生成一個(gè) URL,其它人也可以訪問到你的 vagrant 里的服務(wù)。
如果有了賬號,我們就可以通過 vagrant login 進(jìn)行登錄

$ vagrant login
Username or Email: mitchellh
Password (will be hidden):
You're now logged in!

可以通過 vagrant share 來分享

$ vagrant share
...
==> default: Your Vagrant Share is running!
==> default: URL: http://frosty-weasel-0857.vagrantshare.com
...

可以通過 Ctrl+C 來中止。

中止

vagrant suspend
Vagrant halt
Vagrant destroy

三、網(wǎng)絡(luò)

vagrant 提供了三種網(wǎng)絡(luò)配置方式:端口轉(zhuǎn)發(fā)(默認(rèn))、私有網(wǎng)絡(luò)、公有網(wǎng)絡(luò),可以在配置文件 Vagrantfile 進(jìn)行網(wǎng)絡(luò)配置,推薦使用私有網(wǎng)絡(luò)。

端口轉(zhuǎn)發(fā)(forwarded ports)

1 .定義
端口轉(zhuǎn)發(fā)指把宿主機(jī)的端口映射到虛擬機(jī)的某一個(gè)端口上,訪問宿主機(jī)端口時(shí),請求實(shí)際是被轉(zhuǎn)發(fā)到虛擬機(jī)上指定端口的。
:宿主機(jī)指運(yùn)行虛擬機(jī)的物理機(jī)。

2 .優(yōu)點(diǎn)

  • 容易實(shí)現(xiàn)外網(wǎng)訪問虛擬機(jī)

3 .缺點(diǎn)

  • 如果端口較少需要映射很容易,但是端口比較多時(shí),就比較麻煩,例如:MySQL,redis,nginx等服務(wù)。
  • 不支持在宿主機(jī)使用小于1024的端口來轉(zhuǎn)發(fā),例如:不能使用SSL的443端口來進(jìn)行https連接。

4 .配置
在配置文件Vagrantfile下做如下編輯

Vagrant.configure("2") do |config|
  config.vm.network  
       "forwarded_port"(必須) //端口轉(zhuǎn)發(fā)標(biāo)識
       , guest(必須): //虛擬機(jī)端口
       , host(必須): //宿主機(jī)端口,值必須大于1024
       ,guest_ip(可選): //虛擬機(jī)端口綁定虛擬機(jī)ip地址
       ,host_ip(可選): //虛擬機(jī)端口綁定宿主機(jī)ip
       ,protocol(可選)://指定通信協(xié)議,可以使用tcp/udp,默認(rèn)tcp
       ,auto_correct(可選)://true/false,若配置為true,則每次開啟虛擬機(jī)的時(shí)候自動檢查是否存在端口沖突
end

:若guest_ip和host_ip兩項(xiàng)配置為空,則局域網(wǎng)下的所有設(shè)備都可以訪問該虛擬機(jī)。

示例配置,如下:

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

訪問宿主計(jì)算機(jī)8080端口的請求都轉(zhuǎn)發(fā)到虛擬機(jī)的80端口上進(jìn)行處理。

私有網(wǎng)絡(luò)(private networks)

1 .定義
私有網(wǎng)絡(luò)是指只有宿主機(jī)可以訪問虛擬機(jī),如果多個(gè)虛擬機(jī)設(shè)定在同一個(gè)網(wǎng)段也可以互相訪問。
2 .優(yōu)點(diǎn)

  • 安全,只有自己可以訪問

3 .缺點(diǎn)

  • 團(tuán)隊(duì)成員不能訪問你的虛擬機(jī)

4 .配置
使用私有網(wǎng)絡(luò)的最簡單方法是允許通過DHCP分配IP。

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

這將自動從保留的地址空間分配IP地址。 可以通過使用 vagrant ssh 將 SSH 連接到計(jì)算機(jī)并使用適當(dāng)?shù)拿钚泄ぞ卟檎?IP(例如ifconfig)來確定 IP 地址。

還可以為計(jì)算機(jī)指定靜態(tài)IP地址。 可以使用已知的靜態(tài) IP 訪問 Vagrant 受管計(jì)算機(jī)。 配置如下:

config.vm.network 
                 "private_network"http://必須 ,私有網(wǎng)絡(luò)標(biāo)識
                 , ip: "192.168.33.10"

:私有ip可以自行指定
如果您想自己手動配置網(wǎng)絡(luò)接口,可以通過指定auto_config來禁用Vagrant的自動配置功能:
Vagrant.configure("2") do |config|
config.vm.network "private_network", ip: "192.168.50.4",
auto_config: false
end

公有網(wǎng)絡(luò)(public networks)

1 .定義
公有網(wǎng)絡(luò)是指設(shè)置虛擬機(jī)和宿主機(jī)有相同的網(wǎng)絡(luò)配置。

2 .優(yōu)點(diǎn)

  • 方便團(tuán)隊(duì)協(xié)作,別人可以訪問你的虛擬機(jī)

3 .缺點(diǎn)

  • 只有在有網(wǎng)絡(luò)的情況下才能訪問虛擬機(jī)

4 .配置

Vagrant.configure("2") do |config|
  config.vm.network 
   "public_network" //必須 公有網(wǎng)絡(luò)標(biāo)識
  ,ip(string):  //可選,配置靜態(tài)ip
  ,bridge(string/array): "en1: Wi-Fi (AirPort)"http://可選,設(shè)置橋接的網(wǎng)卡
end

四、分布式環(huán)境

我們可以在 Vagrantfile 里使用 config.vm.define 方法定義多個(gè)主機(jī):

Vagrant.configure("2") do |config|
  config.vm.provision "shell", inline: "echo Hello"

  config.vm.define "web" do |web|
    web.vm.box = "apache"
  end

  config.vm.define "db" do |db|
    db.vm.box = "mysql"
  end
end

如上,config.vm.define 采用定義一個(gè)變量的塊。 此變量(如上面的web)與config 變量完全相同,只是內(nèi)部變量的任何配置僅適用于正在定義的計(jì)算機(jī)。 因此,web 上的任何配置都只會影響 web 計(jì)算機(jī)。也可以繼續(xù)使用 config 對象。 config 對象在特定于機(jī)器的配置之前加載和合并。使用這些范圍時(shí),配置程序等事務(wù)的執(zhí)行順序變得很重要。 Vagrant 按照 Vagrantfile 中列出的順序強(qiáng)制執(zhí)行從外到內(nèi)的排序。 例如,使用下面的 Vagrantfile,輸出順序?yàn)?"A", "C", "B"

Vagrant.configure("2") do |config|
    config.vm.provision :shell, inline: 'echo A'
    config.vm.define :testing do |test|
        test.vm.provision :shell, inline: 'echo B'
    end
    config.vm.provision :shell, inline: 'echo C'
end

當(dāng)在 Vagrantfile 中定義了多臺計(jì)算機(jī)時(shí),各種 vagrant 命令的使用會略有變化。
僅針對單個(gè)機(jī)器有意義的命令(例如 vagrant ssh)現(xiàn)在需要控制機(jī)器的名稱。例如上面的例子,需要使用 vagrant ssh web 或 vagrant ssh db。

默認(rèn)情況下,其他命令(例如 vagrant up)在每臺機(jī)器上運(yùn)行。因此,如果vagrant up ,Vagrant 會啟動 web 和 db 機(jī)器。也可以選擇具體啟動 vagrant up web 或 vagrant up db。此外,也可以指定正則表達(dá)式以僅匹配某些計(jì)算機(jī)。

另外,可以使用自動啟動設(shè)置允許告知 Vagrant 不啟動特定計(jì)算機(jī)。 例:

config.vm.define "web"
config.vm.define "db"
config.vm.define "db_follower", autostart: false

當(dāng)使用上述設(shè)置運(yùn)行 vagrant 時(shí),Vagrant 將自動啟動 "web" 和 "db" 機(jī)器,但不會啟動 "db_follower" 機(jī)器。 可以通過運(yùn)行 vagrant up db_follower 來手動強(qiáng)制 "db_follower" 計(jì)算機(jī)啟動。

可以指定主計(jì)算機(jī)。 主計(jì)算機(jī)將是未指定分布式環(huán)境中的特定計(jì)算機(jī)時(shí)使用的默認(rèn)計(jì)算機(jī)。要指定默認(rèn)計(jì)算機(jī),只需在定義時(shí)將其標(biāo)記為主計(jì)算機(jī)。 只能指定一臺主機(jī)。

config.vm.define "web", primary: true do |web|
  # ...
end

Push

從版本1.7開始,Vagrant 能夠?qū)⑴c Vagrantfile 相同的目錄中的應(yīng)用程序代碼部署或“推送”到遠(yuǎn)程數(shù)據(jù)庫(如FTP服務(wù)器或HashiCorp的Atlas)。
推送的定義在應(yīng)用程序的 Vagrantfile 中定義,并使用 vagrant push 子命令調(diào)用。 與 Vagrant 的其他組件非常相似,每個(gè) Vagrant Push 插件都有自己的配置選項(xiàng)。 有關(guān)更多信息,請參閱Vagrant Push插件的文檔。 以下是Vagrantfile中的Vagrant Push配置部分示例:

config.push.define "ftp" do |push|
  push.host = "ftp.company.com"
  push.username = "..."
  # ...
end

當(dāng)應(yīng)用程序準(zhǔn)備好部署到FTP服務(wù)器時(shí),只需運(yùn)行一個(gè)命令:

vagrant push

與 Vagrant Providers 非常相似,Vagrant Push也支持多個(gè)后端聲明。 考慮staging 和 QA 環(huán)境的常見情況:

config.push.define "staging", strategy: "ftp" do |push|
  # ...
end

config.push.define "qa", strategy: "ftp" do |push|
  # ...
end

在這種情況下,用戶必須將 Vagrant Push 的名稱傳遞給子命令:

vagrant push staging

參考:
https://www.vagrantup.com/docs/
https://jimmysong.io/posts/vagrant-intro/
http://www.itdecent.cn/p/050b0a4468c4

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Vagrant 的介紹 虛擬開發(fā)環(huán)境 平常我們經(jīng)常會遇到這樣的問題:在開發(fā)機(jī)上面開發(fā)完畢程序,放到正式環(huán)境之...
    斐波那契額閱讀 1,966評論 1 12
  • 開發(fā)需要在各種系統(tǒng)上進(jìn)行開發(fā)任務(wù),運(yùn)維則需要在各種系統(tǒng)上學(xué)習(xí)工具使用。因此,虛擬機(jī)恐怕也是 IT 人員最常使用的工...
    李廣慧閱讀 5,691評論 3 24
  • 1,介紹Vagrant 我們做web開發(fā)的時(shí)候經(jīng)常要安裝各種本地測試環(huán)境,比如apache,php,mysql,r...
    meng_philip123閱讀 2,643評論 0 12
  • Vagrant是什么 Vagrant是一個(gè)軟件,可以自動化虛擬機(jī)的安裝和配置流程。目前市面上個(gè)人PC的主流操作系統(tǒng)...
    北魏企鵝閱讀 30,467評論 3 40
  • 就如標(biāo)題所講,你有抱怨過嗎? 我也抱怨過,身邊也有一些朋友抱怨過。 2017年的春節(jié),回家過年,和幾個(gè)發(fā)小一起出去...
    小書攤的攤主閱讀 1,384評論 0 5

友情鏈接更多精彩內(nèi)容