︿
Top

Mac上使用Vagrant 編排工具來管理你的虛擬機器


為什麼要使用編排工具來管理我的虛擬機器呢?難道我就不能用滑鼠一個一個點擊安裝機器嗎?就如同近年來熱門的容器編排工具docker-compose,當我們面臨數量龐大的終端機器或容器管理時,自動化的創建與管理成為了團隊框架規範與效率提升的最佳選擇。

Vagrant支援絕大多數市面上熱門的HyperVisor管理如 Vmware、HyperV、VirtualBox、LinuxKVM、Parallels,也支援容器Docker,甚至透過外掛也能支援AWS虛擬機器的增刪查改,目前多用於軟體開發人員在「本機上的測試環境建置」,只要上Vagrant Cloud找尋相關的映像檔模板,並於本機設定好相關虛擬機器參數,不用安裝作業系統、不用三分鐘,你的服務已上線!



使用Vagrant編排工具部署VirtualBox虛擬機器



2. Install Vagrant from https://www.vagrantup.com/downloads


4. 將Box file加入Vagrant的本地倉庫
tomy@TomydeMacBook-Pro ~ % vagrant box add centos7.9_v3.6.8 https://app.vagrantup.com/generic/boxes/centos7/versions/3.6.8/providers/virtualbox.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'centos7.9_v3.6.8' (v0) for provider: 
    box: Downloading: https://app.vagrantup.com/generic/boxes/centos7/versions/3.6.8/providers/virtualbox.box
==> box: Successfully added box 'centos7.9_v3.6.8' (v0) for 'virtualbox'!
tomy@TomydeMacBook-Pro ~ % vagrant box list
centos7.9_v3.6.8         (virtualbox, 0)
5. 於家目錄中建立一個給Vagrant創建vm用的專屬工作目錄並生成設定檔
tomy@TomydeMacBook-Pro ~ % pwd 
/Users/tomy/
tomy@TomydeMacBook-Pro ~ % mkdir myVM
tomy@TomydeMacBook-Pro ~ % cd myVM
tomy@TomydeMacBook-Pro myVM % vagrant init centos7.9_v3.6.8
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
`vagrantup.com` for more information on using Vagrant.
6. 編輯新生成的Vagrantfile設定檔,於config.vm.box前後新增其他設定參數
config.vm.define "ansinble-control" do |myvm|
    myvm.vm.box = "centos7.9_v3.6.8"
    myvm.vm.hostname = "ansible-control"
    myvm.vm.network "public_network"
    myvm.vm.provider "virtualbox" do |vb|
        vb.name = "ansible-control"
        vb.gui = false
        vb.memory = "2048"
        vb.cpus = "1"
    end
end
系統預設會自動建立一張NAT模式的虛擬網路卡,若無需其他類型的網卡(本範例是多一張橋接虛擬網路卡public_network),則可將myvm.vm.network該行移除
7. 建立、啟動虛擬機器並選擇橋接網卡,由於我家的Macbook是使用WIFI連網,故此處我選擇的是1,請依照您的環境選取合適的選項
tomy@TomydeMacBook-Pro ~ % vagrant up 
==> ansinble-control: Clearing any previously set forwarded ports...
==> ansinble-control: Clearing any previously set network interfaces...
==> ansinble-control: Available bridged network interfaces:
1) en0: Wi-Fi (Wireless)
2) en5: USB Ethernet(?)
3) ap1
4) awdl0
5) llw0
6) en3: Thunderbolt 1
7) en4: Thunderbolt 2
8) en8: Thunderbolt 0
9) en9: Thunderbolt 0
==> ansinble-control: When choosing an interface, it is usually the one that is
==> ansinble-control: being used to connect to the internet.
==> ansinble-control: 
    ansinble-control: Which interface should the network bridge to?
一勞永逸的於設定檔中加入以下,則每次啟動該虛擬機器時便不會再次詢問橋接綁定的虛擬網路卡:
myvm.vm.network :public_network,:bridge=>'en0: Wi-Fi (Wireless)'
8. 確認虛擬機狀態
tomy@TomydeMacBook-Pro myVM % vagrant status
Current machine states:

ansinble-control          running (virtualbox)

The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.

9. 利用指令快速連入虛擬機器終端機
tomy@TomydeMacBook-Pro myVM % vagrant ssh



Vagrant Provisioning 預載script


雖然透過Vagrant的Box機制可以快速的安裝好虛擬機器所需的作業系統或服務,但有時候我們會有一些額外、附加的程序或作業想要在初次安裝虛擬機器的時候執行,便可透過vm.provision參數來添加。

比如說在VM專屬的工作目錄下寫一shell script
tomy@TomydeMacBook-Pro myVM % nano script.sh
#!/bin/bash
yum install -y nano 

在初次vagrant up時便會於虛擬機器開機後載入執行該script,詳細的用法可參閱官方教學文件
Vagrant.configure("2") do |config|
  config.vm.provision "shell", path: "script.sh"
end



Vagrant在VirtualBox下的網路配置



以我目前正在使用的VirtualBox Version 6.1.32版本來看,共有八種模式,而透過Vagrant可使用或設置的僅有四種網路模式分別如下:

1. NAT
2. Host-Only
3. Internal Network
4. Public Network (Bridged)


其中Vagrant可用的NAT模式並非VirtualBox中的NAT service模式,於NAT內網中的虛擬機器不能與其他虛擬機器交流,僅能與宿主機HOST交流,宿主機HOST欲存取該VM的服務需透過Port Forward參數設定,而該VM則可自由存取宿主機HOST相關服務,並能透過宿主機HOST的NAT網路聯外。

透過Vagrant所建立的虛擬機器都會「自動建立一張NAT的虛擬網路卡」,以便Vagrant ssh的控制管理,若需再增加其他類型的虛擬網路卡,則需透過參數vm.network去增設。

比如我要增建一張Host-Only的虛擬網卡
Vagrant.configure("2") do |config|
  config.vm.network "private_network", ip: "192.168.60.10"
end
比如我要增建一張Internal Network的虛擬網卡
Vagrant.configure("2") do |config|
  config.vm.network "private_network", ip: "192.168.62.10", virtualbox__intnet: true
end
比如我要增建一張public Network和一張Host-Only的虛擬網卡
Vagrant.configure("2") do |config|
  config.vm.network "public_network"
  config.vm.network "private_network", ip: "192.168.60.10"
end
比如我要增建一張支援VirtIO的橋接虛擬網卡
Vagrant.configure("2") do |config|
  config.vm.network "public_network", nic_type: "virtio"
end

另外需要特別注意的是Host-Only網路裡面的Ip也不是想怎麼設置就怎麼設置的,在Linux、MAC OS下所安裝的VirtualBox,其Host-Only存在的IP範圍限制是192.168.56.0/21,詳情可參閱VirtaulBox官網文件,若超出此範圍Vagrant在網路上的設置啟用將會失敗。




其他Vagrant控制指令


顯示本地倉庫中的Box files
vagrant box list
移除本地倉庫中的指定Box files
vagrant box remove [Box_Name]
開機
vagrant up
關機
vagrant halt
暫停
vagrant suspend
恢復
vagrant resume
重啟虛擬機器並載入Vagrantfile
vagrant reload
刪除虛擬機器並包括整個虛擬機器檔案與目錄
vagrant destroy
查看虛擬機器ssh相關設置
vagrant ssh-config





本文內容參閱以下連結:

tomy

來自台灣的系統工程師,一直熱衷於 Open source 相關技術的學習、建置、應用與分享。

  • Image
  • Image
  • Image
  • Image
  • Image

0 Comments:

張貼留言