昨天介紹了 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
並搭配 push
、pop
、save
、restore
、list
、delete
等子指令 (subcommand) 來處理快照相關功能,可參考 https://www.vagrantup.com/docs/cli/snapshot.html 的說明。
$ vagrant box
指令可用來管理 box,它的子指令有 add
、list
、outdated
、prune
、remove
、repackage
、update
等。第一次新建環境時,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。那麼今天就到這裡囉。