使用Vagrant部署虛擬分散式開發和測試環境
同步更新到筆者個人部落格,可以訪問我的部落格檢視原文:https://www.rockysky.tech
建立自動化配置開發環境
最近由於最近研究和學習的關係,需要經常配置和搭建多個虛擬機器組成的分散式系統。原來只是用虛擬機器程式,比如說用Virtual box直接建立虛擬機器。如果只是偶爾建立虛擬機器研究的話,我覺得直接使用Hyper-V或者Virtual box還是沒問題的。但是這段時間需要經常批量建立虛擬機器,然後有可能會在開發或者測試完成後銷燬這些虛擬機器。而且完成的虛擬機器配置有時需要固定下來以後再使用。其實大家可以發現,這些需求,是能夠用容器技術來實現嗎?但是容器技術並不能建立完整的VM,而且容器技術通常是無狀態的,用於執行微服務應用。對於資料庫和儲存類的分散式應用。或者要求固定儲存的應用環境的搭建其實並不適合。
安裝和配置Vagrant
Vagrant是用Ruby語言開發的多虛擬機器(Multiple Hypervisors)自動化管理工具。Vagrant的最新版本是2.2.7。這個工具的安裝非常簡單,安裝包可以在下面的頁面下載:https://www.vagrantup.com/downloads.html 我是在自己的Windows作業系統上安裝的。執行安裝程式,然後選擇好安裝目錄就可以開始了。Vagrant是一個命令列工具,沒有UI介面。所以安裝完成後我們開啟PowerShell,或者安裝的作業系統的shell程式,輸入以下命令:
vagrant -v
我們就可以看到會顯示版本號,我安裝的是最新的2.2.7。如果正常那就應該沒啥問題了。然後是安裝虛擬機器程式,在windows作業系統上我們可以選擇Virtualbox,VMware workstation和Hyper-V。Hyper-V是windows自帶的虛擬機器程式,效能最好,不過我還是不推薦使用。主要還是因為Hyper-V本身功能和設計還不太成熟,如果刪除一臺虛擬機器,相關的硬碟等資源不會同步刪除,還需要手工清理。而且在預設設定下對CPU和記憶體的消耗比較大。當然最重要的因素還是Vagrant的Box庫中提供的支援HyperV的box還是比較少,更新也不及時。VMWare Workstation在Windows的相容性不太好,使用起來總感覺不是特別順手,而且還老是提示升級到付費的Pro版本,反正就是使用者體驗不大好。因此,綜合起來,我比較推薦單機VM開發測試環境採用Virtualbox。
接下來就是從Oracle的網站上下載VirtualBox和安裝了,這個過程也很簡單和直觀,就不詳細描述了。安裝完Virtual Box後,windows系統的使用者請一定要關閉HyperV功能,如下圖所示:
也可以在Powershell命令列輸入下面的命令(需要管理員許可權)
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
#### 安裝Vagrant外掛vagrant share
如果希望能夠把配置好的虛擬機器環境共享給其他人演示,或者和其他人合作。需要安裝vagrant share外掛,可以使用下面的命令:
vagrant plugin install vagrant-share
需要連線Vagrant在國外的伺服器,所以安裝會需要一段時間,等待一會兒後就會完成了。這個功能需要和ngrok.com內網穿透服務一起使用。
Vagrant的基本使用和操作
首先執行Vagrant幫助命令,檢視大致有哪些命令和功能:
Vagrant會把一個虛擬機器打包成box,這個有點類似docker的image概念。就是用來生成一個完整的虛擬機器的。按照官網的說明建立一個標準的Ubuntu或者Centos非常容易。直接從官方的box庫就可以下載並執行。下面的命令會在當前資料夾生成一個Vagrantfile配置檔案。然後執行vagrant up就能夠建立並執行一個Ubuntu18.4的虛擬機器了,預設狀態是使用的VirtualBox作為虛擬機器Provider。
vagrant init hashicorp/bionic64
vagrant up
不過由於眾所周知的原因,國內的下載速度是非常非常緩慢的。慢到懷疑是在上個世紀90年代的網速。
各種映象源
http://www.vagrantbox.es/, 當然也可以到官方主頁上去查詢和下載。清華和科大有Centos和Ubuntu的Box映象。下載下來以後如何載入。
vagrant box add https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cloud-images/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box --name ubuntu/trusty
上面是下載清華的源
vagrant box add C:\test.box --name unbuntu1804
上面的是通過本地box載入
box被載入到本地以後我們可以通過box list命令檢視, 我們可以看到本地現在已經有了兩個box了。
PS D:\vagrant\example2> vagrant box list
ubuntu1804 (virtualbox, 0)
ubuntuNew (virtualbox, 0)
過載,掛起,暫停和銷燬虛擬機器
vagrant suspend #這個命令是暫停虛擬機器
vagrant halt #關閉虛擬機器
vagrant destroy #徹底銷燬虛擬機器
vagrant reload #配置檔案修改過後,可以重新載入配置
ssh登入虛擬機器
vagrant ssh
我們通過vagrant status可以檢視所有虛擬機器的執行狀態,如果有多個虛擬機器在執行,需要加上機器名稱
vagrant ssh node1
從新打包Box
當我們修改了原始的虛擬機器配置,需要把現在的虛擬機器作為標準開發環境的box時,我們應該用package命令:
vagrant package [name|id]
詳細用法:https://www.vagrantup.com/docs/cli/package.html
Vagrant的配置檔案
直接執行 vagrant init,然後開啟這個檔案。我們可以看到各個配置項。最基本的配置檔案如下, 這個是用名稱是hashicorp/bionic64的box建立一個虛擬機器。
Vagrant.configure("2") do |config|
config.vm.box = "hashicorp/bionic64"
end
可以加入box的版本資訊
Vagrant.configure("2") do |config|
config.vm.box = "hashicorp/bionic64"
config.vm.box_version = "1.1.0"
config.vm.hostname = "myhost"
end
配置私有網路,
這個是用虛擬閘道器作為dhcp伺服器自動分配IP地址
Vagrant.configure("2") do |config|
config.vm.network "private_network", type: "dhcp"
end
配置IPV4靜態地址
Vagrant.configure("2") do |config|
config.vm.network "private_network", ip: "192.168.50.4"
end
配置IPV6靜態地址
Vagrant.configure("2") do |config|
config.vm.network "private_network", ip: "fde4:8dba:82e1::c4"
end
配置公有網路
這個是用和主機物理網絡卡橋接的模式連線到外部的路由器的模式。外部網路可以訪問到這臺虛擬機器
Vagrant.configure("2") do |config|
config.vm.network "public_network"
end
同時配置多臺虛擬機器
通過下面的方式可以配置多臺虛擬機器
Vagrant.configure("2") do |config|
config.vm.provision "shell", inline: "echo Hello"
config.vm.define "node1" do |n1|
n1.vm.box = "mybox"
end
config.vm.define "node2" do |n2|
n2.vm.box = "mybox2"
end
end