Vagrant 簡介
Vagrant 是一個用來構(gòu)建和管理虛擬機(jī)環(huán)境的工具。Vagrant 有著易于使用的工作流,并且專注于自動化,降低了開發(fā)者搭建環(huán)境的時間,提高了生產(chǎn)力。解決了“在我的機(jī)器上可以工作”的問題。
Vagrant 是為了方便的實現(xiàn)虛擬化環(huán)境而設(shè)計的,使用 Ruby 開發(fā),基于 VirtualBox 等虛擬機(jī)管理軟件的接口,提供了一個可配置、輕量級的便攜式虛擬開發(fā)環(huán)境。使用 Vagrant 可以很方便的就建立起來一個虛擬環(huán)境,而且可以模擬多臺虛擬機(jī),這樣我們平時還可以在開發(fā)機(jī)模擬分布式系統(tǒng)。
團(tuán)隊新員工加入,常常會遇到花一天甚至更多時間來從頭搭建完整的開發(fā)環(huán)境,而有了 Vagrant,只需要直接將已經(jīng)打包好的 package(里面包括開發(fā)工具,代碼庫,配置好的服務(wù)器等)拿過來就可以工作了,這對于提升工作效率非常有幫助。
為什么選擇 Vagrant
Vagrant 提供了一個易于配置,可重復(fù)使用,兼容的環(huán)境,通過一個單一的工作流程來控制,幫助你和團(tuán)隊最大化生產(chǎn)力和靈活性。 為了實現(xiàn) Vagrant 的魔力,Vagrant 站在了巨人的肩膀上。虛擬機(jī)的配置基于 VirtualBox,VMware,AWS 或者其他提供商。然后一些配置工具,比如 shell 腳本,Chef 或者 Puppet 可以自動化地在虛擬機(jī)安裝并配置軟件。
對于開發(fā)者人員
如果你是一個開發(fā)者,Vagrant 將在一個一次性的、一致的環(huán)境中隔離依賴項及其配置,而不會影響你習(xí)慣使用的任何工具(編輯器、瀏覽器、調(diào)試器等)。一旦你或者其他人創(chuàng)建了一個 Vagrantfile,你只需要執(zhí)行 vagrant up
所有的東西就自動安裝和配置了。你團(tuán)隊中的其他成員使用同一個配置文件來創(chuàng)建開發(fā)環(huán)境,因此不管你工作在 Linux,MacOS X 還是 Windows, 所有團(tuán)隊的成員都可以在統(tǒng)一的環(huán)境環(huán)境中運(yùn)行代碼,這樣就可以避免“在我的機(jī)器上可以工作”的問題。
對于運(yùn)維人員
如果你是一個運(yùn)維工程師或者 DevOps 工程師,Vagrant 給予你一個一次性的環(huán)境來開發(fā)和測試基礎(chǔ)架構(gòu)管理腳本。你可以使用本地虛擬機(jī)(比如 VirtualBox 或者 VMware)馬上測試一些東西,比如 shell 腳本、Chef cookbooks、Puppet 模塊等。然后,你可以用同樣的配置在遠(yuǎn)程云上,比如 AWS 或者 RackSpace,來測試這些腳本。拋棄之前自定義腳本來回收 EC2 實例吧,停止使用 SSH 在各種機(jī)器之間跳來跳去,請開始使用 Vagrant 來給你的工作帶來更多便利。
Vagrant 和 Terraform 的區(qū)別
Vagrant 和 Terraform 都出自同一個公司 HashiCorp[1],該公司主要做一些開源軟件,相關(guān)的產(chǎn)品還有 Packer[2],Consul[3],Vault[4],Nomad[5] 等。
Terraform 的主要用途是管理云提供商的遠(yuǎn)程資源,比如 AWS。Terraform 可以管理橫跨多個云提供商巨量的基礎(chǔ)設(shè)施。而 Vagrant 主要用來管理僅使用少量虛擬機(jī)的本地開發(fā)環(huán)境。
Vagrant 用于開發(fā)環(huán)境,Terraform 普遍用于基礎(chǔ)設(shè)施管理。
VirtualBox 安裝
VirtualBox 是 Oracle 開源的虛擬化系統(tǒng),和 VMware 是同類產(chǎn)品,支持多個平臺,可以到官方網(wǎng)站:https://www./wiki/Downloads 下載適合你平臺的 VirtualBox 最新版本并安裝。
提示:對于 Mac 用戶,如果系統(tǒng)為 OSX 10.13.3(mac OS High Sierra) 或者更高版本,安裝過程可能會失敗,報錯提示安裝失敗,安裝器遇到了一個錯誤導(dǎo)致安裝失敗...
,原因是新版本 Mac 系統(tǒng)的安全機(jī)制阻止外部內(nèi)核擴(kuò)展安裝,導(dǎo)致安裝失敗。兩種解決方法:
1. 進(jìn)入系統(tǒng)偏好設(shè)置 > 安全性與隱私 > 通用,然后手動允許;
2. 在終端敲命令禁用此安全特性:sudo spctl --master-disable
;
Vagrant 安裝
到官方網(wǎng)站下載相應(yīng)系統(tǒng)平臺的安裝包:http://www./downloads.html 。
直接根據(jù)向?qū)нM(jìn)行操作即可完成安裝,安裝完后就可以在終端輸入 vagrant
命令了。
提示:盡量下載最新的程序,因為 VirtualBox 經(jīng)常升級,升級后有些接口會變化,老的 Vagrant 可能無法使用。
Vagrant 啟動第一臺虛擬機(jī)
到此準(zhǔn)備工作(VirtualBox 和 Vagrant 安裝)基本上做完了,接下來就可以通過 Vagrant 來啟動一臺虛擬機(jī)了。
在啟動虛擬機(jī)之前先簡單介紹下 Vagrant box,box 是一個打包好的操作系統(tǒng),是一個后綴名為 .box
的文件,其實是一個壓縮包,里面包含了 Vagrant 的配置信息和 VirtualBox 的虛擬機(jī)鏡像文件。vagrant up
啟動虛擬機(jī)是基于 box 文件的,因此在啟動虛擬機(jī)前必須得把 box 文件準(zhǔn)備好。或者也可以在啟動的時候指定遠(yuǎn)程 box 地址,在這里我把 box 文件下載下來,然后啟動時指定該文件。
我使用網(wǎng)上分享的 ubuntu-server-16.04
這個 box,由于vagrant 官方 box[8] 下載速度特別慢,所以在此提供一下該 box 的百度網(wǎng)盤下載地址,加速下載: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 文件或者遠(yuǎn)程 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 是否添加成功
查看當(dāng)前 vagrant 中有哪些 box:
haohao $ vagrant box list
ubuntu-server-16.04 (virtualbox, 0)
4、初始化上面添加的 box
初始化命令格式:
本地 box 名稱:第 2 步中添加的 box 名稱
這里初始化前面添加的 box,初始化后會在當(dāng)前目錄生產(chǎn)一個 Vagrantfile 文件,里面包含了虛擬機(jī)的各種配置,關(guān)于具體每個配置項是什么意思,后面會介紹。
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
`` for more information on using Vagrant.
5、啟動虛擬機(jī)
虛擬機(jī)啟動命令:
啟動虛擬機(jī)時會自動將當(dāng)前目錄(即 Vagrantfile 文件所在目錄),和虛擬機(jī)的 /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、連接虛擬機(jī)
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 共享目錄
進(jìn)入虛擬機(jī)后執(zhí)行 df -h
可以看到 Vagrant 默認(rèn)把宿主機(jī) Vagrantfile
所在的目錄和虛擬機(jī)的 /vagrant
目錄共享,可以通過 ls /vagrant/
查看該目錄內(nèi)容,內(nèi)容和宿主機(jī)對應(yīng)目錄一致。
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 查看該共享目錄內(nèi)容和宿主機(jī)內(nèi)容一致
haohao $ ls /vagrant/
ubuntu-xenial-16.04-cloudimg-console.log Vagrantfile
Vagrant 配置文件淺析
前面我們執(zhí)行 vagrant init <本地 box 名稱>
會在當(dāng)前目錄生成 Vagrantfile 文件,這個文件是非常重要的,一般給別人共享自己的環(huán)境時都是提供一個 Vagrantfile 和一個 box 文件,這樣就可以很輕松地將環(huán)境共享給別人,別人能得到一模一樣的統(tǒng)一的環(huán)境,這就是使用 Vagrant 的好處。
Vagrantfile 主要包括三個方面的配置,虛擬機(jī)的配置、SSH配置、Vagrant 的一些基礎(chǔ)配置。Vagrant 是使用 Ruby 開發(fā)的,所以它的配置語法也是 Ruby 的,對于沒有學(xué)過 Ruby 的朋友也沒關(guān)系,根據(jù)例子模仿下就會了。
修改完配置后需要執(zhí)行 vagrant reload
重啟 VM 使其配置生效。
以下簡單介紹下常用配置的配置項:
1. box 名稱設(shè)置
上面這配置展示了 Vagrant 要去啟用那個box作為系統(tǒng),也就是前面我們輸入 vagrant init <本地 box 名稱>
時所指定的 box,如果沒有輸入 box 名稱的話,那么默認(rèn)就是 base
。
2、VM 相關(guān)配置
VirtualBox 提供了 VBoxManage 這個命令行工具,可以讓我們設(shè)定 VM,用modifyvm
這個命令讓我們可以設(shè)定 VM 的名稱和內(nèi)存大小等等,這里說的名稱指的是在 VirtualBox 中顯示的名稱,我們也可以在 Vagrantfile 中進(jìn)行設(shè)定,舉例如下:
調(diào)用 VBoxManage 的 modifyvm
的命令,設(shè)置 VM 的名稱為 ubuntu
,內(nèi)存為 1024 MB。你可以類似的通過定制其它 VM 屬性來定制你自己的 VM。
config.vm.provider 'virtualbox' do |v|
v.customize ['modifyvm', :id, '--name', 'ubuntu', '--memory', '1024']
end
3、網(wǎng)絡(luò)設(shè)置
Vagrant 有兩種方式來進(jìn)行網(wǎng)絡(luò)連接,一種是 host-only (主機(jī)模式),這種模式下所有的虛擬系統(tǒng)是可以互相通信的,但虛擬系統(tǒng)和真實的網(wǎng)絡(luò)是被隔離開的,虛擬機(jī)和宿主機(jī)是可以互相通信的,相當(dāng)于兩臺機(jī)器通過雙絞線互聯(lián)。另一種是 Bridge(橋接模式),該模式下的 VM 就像是局域網(wǎng)中的一臺獨(dú)立的主機(jī),可以和局域網(wǎng)中的任何一臺機(jī)器通信,這種情況下需要手動給 VM 配 IP 地址,子網(wǎng)掩碼等。我們一般選擇 host-only 模式,配置如下:
config.vm.network :private_network, ip: '11.11.11.11'
4、hostname 設(shè)置
hostname
的設(shè)置非常簡單:
config.vm.hostname = 'kubernetes'
5、目錄共享
我們前面介紹過/vagrant
目錄默認(rèn)就是當(dāng)前的開發(fā)目錄,這是在虛擬機(jī)開啟的時候默認(rèn)掛載同步的。我們還可以通過配置來設(shè)置額外的同步目錄:
# 第一個參數(shù)是主機(jī)的目錄,第二個參數(shù)是虛擬機(jī)掛載的目錄
config.vm.synced_folder '/Users/haohao/data', '/vagrant_data'
6、端口轉(zhuǎn)發(fā)
對宿主機(jī)器上 8080 端口的訪問請求 forward 到虛擬機(jī)的 80 端口的服務(wù)上:
config.vm.network :forwarded_port, guest: 80, host: 8080
Vagrant 常用命令清單
? vagrant box list
列出 Vagrant 當(dāng)前 box 列表? vagrant box remove
刪除相應(yīng)的 box? vagrant destroy
停止當(dāng)前正在運(yùn)行的虛擬機(jī)并銷毀所有創(chuàng)建的資源? vagrant halt
關(guān)機(jī)? vagrant package
把當(dāng)前的運(yùn)行的虛擬機(jī)環(huán)境進(jìn)行打包為 box 文件? vagrant reload
重新啟動虛擬機(jī),重新載入配置文件? vagrant resume
恢復(fù)被掛起的狀態(tài)? vagrant ssh-config
輸出用于 ssh 連接的一些信息? vagrant status
獲取當(dāng)前虛擬機(jī)的狀態(tài)? vagrant suspend
掛起當(dāng)前的虛擬機(jī)Vagrant 啟動虛擬機(jī)集群
前面我們都是通過一個 Vagrantfile 配置啟動單臺機(jī)器,如果我們要啟動一個集群,那么可以把需要的節(jié)點在一個 Vagrantfile 寫好,然后直接就可以通過 vagrant up
同時啟動多個 VM 組成一個集群。以下示例配置一個 web 節(jié)點和一個 db 節(jié)點,兩個節(jié)點在同一個網(wǎng)段,并且使用同一個 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
相關(guān)連接
? https://www./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