iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 4
0

昨天介紹了 Vagrantfile 以及建立 Vagrant 虛擬環境的方法,接下來介紹幾個存取 Vagrant 虛擬環境的指令。

$ vagrant ssh

用 vagrant 帳號身份登入虛擬機,不需要提供虛擬機 IP、帳號、密碼什麼的。這邊會用 ssh key 免密碼機制登入。登入後若要執行 root 權限指令,可直接在指令前加上 sudo 來達成。之後有機會再進行 ssh 相關說明。

$ vagrant halt

將虛擬機關機,會先嘗試優雅關機 (gracefully shutdown),若失敗了或者指令有加上 -f 旗標,就會直接將虛擬機電源關閉。

$ vagrant suspend

將虛擬機暫停,會保留暫停時的狀態。

$ vagrant up

昨天我們使用這個指令來新建一個虛擬機器並啟動它,而它也可以用於啟動已關閉的虛擬機,或者將暫停的虛擬機恢復執行。文件說它是 Vagrant 最重要的指令,其實 Vagrant 官網的 URL 就是 vagrantup.com 呢。

$ vagrant destroy

想要刪除虛擬機時,使用這個指令。

上述指令最好都在 Vagrantfile 所在的目錄執行,免得 Vagrant 搞錯成別台機器。接下來我們來看一些比較進階的指令及功能,所謂進階就是我沒用過的意思。

首先是快照 (snapshot) 的功能,我們可使用快照來儲存虛擬機當下的狀態,並視需要將機器回復到特定快照的狀態。請使用 $ vagrant snapshot 並搭配 pushpopsaverestorelistdelete 等子指令 (subcommand) 來處理快照相關功能,可參考 https://www.vagrantup.com/docs/cli/snapshot.html 的說明。

$ vagrant box 指令可用來管理 box,它的子指令有 addlistoutdatedpruneremoverepackageupdate 等。第一次新建環境時,Vagrant 會檢查並下載指定的 box,也可以用 $ vagrant box add [box-name] 直接下載並將 box 加入。此外可以用 $ vagrant box outdated 來檢查 box 是否有新的版本,若有的話用 $ vagrant box update 來下載新版,並用 $ vagrant box prune 移除舊版。相關指令說明請參考 https://www.vagrantup.com/docs/cli/box.html

接下來我們看一下 provisioning 的部分。我之前一直沒搞懂 provisioning 是什麼意思,查了一下在資訊服務相關領域 provisioning 這個字是「服務開通」的意思,在中文維基百科的說明如下:

伺服器服務開通(Server provisioning)是指:以合適的系統、數據和軟體來準備一個伺服器,並使其可用於網絡操作的一系列動作。開通一個伺服器的典型任務是:從一個可用伺服器的池裡面選擇一個伺服器,載入相應的軟體(作業系統、設備驅動、中間件和應用程式),適當地對系統和軟體進行定製化和配置,從而為這個伺服器創建或改變一個引導映像(boot image),並隨後更改其參數,例如網際協議(IP)地址、網際協議網關,以找到相關的網絡和存儲資源(某些時候被獨立分出為資源開通)來審計該系統。通過審計此系統,確保只有有限的漏洞並遵從開放式漏洞和評價語言(Open Vulnerability and Assessment Language,簡稱OVAL),保證承諾,或安裝補丁。在這些動作後,重啟系統並載入新軟體。這使得系統做好了運營的準備。

過程看起來挺複雜的,總之 provisioning 是機器「第一次」被建立起來時或要加入服務前必須進行的工作。在 Vagrantfile 中我們在 config.vm.provision 區段指定了 provisioning 要執行的任務。當我們使用 vagrant up 啟動一台已建立完成的機器時,觀察啟動過程的 console 輸出,在最後會看到下列文字:

==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: flag to force provisioning. Provisioners marked to run always will still run.

翻成中文是這麼說的:機器已經「開通」過了,可以執行 vagrant provision 或者是用 --provision 旗標來強制執行 provisioning。最後一句我猜是說 Vagrantfile 中 provision 的區塊在前述的狀況下仍然會被執行的意思。

我們來實驗一下,假設我們現在想在 provisioning 的時候安裝 python,可以在 Vagrantfile provision 的區段加上 apt-get -y install python-minimal。直接執行 $ vagrant up 啟動虛擬機,這段 provision 並不會被執行。如果想執行這段指令,如上述所說有兩個作法,第一個方法是在啟動機器時使用 $ vagrant up --provision 指令,第二個方法是在機器運行的狀態下,執行 $ vagrant provision,如此 provisioning 的區段就會再次被執行了。provisioning 除了使用 shell command 外,也可以搭配 Ansible、Chef 這類型的開通設置工具使用,或是 Docker,這部分等之後介紹到相關工具後有機會再說明。

在【應試目標能力】中最後一個主題是多台機器建置 (multi machine deployment)。比如說今天可能想要研究在 cluster 環境進行的技術,例如 Kubernetes 或什麼的,需要多台虛擬機一起工作,就可以用這個方式同時管理多個 Vagrant 環境。它有點像是將多個 Vagrantfile 合成一個,然後透過此 Vagrantfile 可以同時設定啟動多台機器。我們來看一下官網的範例:

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

我們可以看到在 Vagrant.configure 中間有 config.vm.define 的兩個區塊,每一個 config.vm.define 區塊都定義了自己的一台機器。由於要管理多台機器,會各別給予這些機器名稱,如範例中的 web 及 db。請注意這裡的名稱不是 hostname,只是用來讓我們在執行指令時方便稱呼。這裡內層區塊設定機器的方式和前面介紹過的差不多,就不再說明。如上述所說,存取機器的指令視情形需要加上機器名稱,例如 $ vagrant up 會啟動所有的機器,而 $ vagrant ssh 需指定機器名稱,如 $ vagrant ssh web。關於多機建置請參考 https://www.vagrantup.com/docs/multi-machine/ 有更詳細的說明。

結語

這兩天介紹的 Vagrant 是日常管理虛擬機器很實用的工具,主要說明了 Vagrantfile 的內容及存取 Vagrant 環境的指令,我自己覺得大致上可以涵蓋個人應用 Vagrant 時的多數情景。更多說明請參考官方文件 https://www.vagrantup.com/docs/index.html。那麼今天就到這裡囉。


上一篇
[Day 03] Vagrant (1)
下一篇
[Day 05] Git (1)
系列文
30 天準備 LPI DevOps Tools Engineer 證照30

尚未有邦友留言

立即登入留言