使用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:vagrantexample2> 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