既然要開始在 Windows 上沿用 Mac 及 Unix 的命令列工具習慣1,免不了要處理 Ansible 及 Vagrant。
雖然這兩個軟體都有對應的 Windows 版本,但據我以前的經驗,卡卡的,有許多小地雷;畢竟這些發跡自泛 Unix 家族的軟體,不是那麼容易無縫移植到對命令列不友善的 Windows 家族。
如今 Windows 已經有 WSL (Windows Subsystem for Linux) 機制,是否可以更無痛享用 Ansible 及 Vagrant 呢?
可以的。
大體而言,我們會兵分二路:
-
在 Windows 上,會安裝 VirtualBox。
虛擬機選項一:VirtualBox
用慣 Mac 或 Linux 的人,可能會想沿用 VirtualBox 虛擬機軟體。畢竟 VirtualBox 是同屬開源生態系的一員,和其他開源軟體的相容性最高。
你可以直接去官方網站下載安裝檔(VirtualBox 本體,以及 VirtualBox Extension Pack),或是直接透過 Chocolatey 套件管理工具來安裝:
C:\> choco install virtualbox
安裝完後,還有一關要克服。
一般來說,在同一個 host OS 上,同一時間,只能有一個底層虛擬機制存在(除非有像「巢狀虛擬化」之類的黑魔法……吧?)。因此,VirtualBox 無法與 Windows 官方欽定的 Hyper-V 機制同時並存,一山不容二虎2。
如果決定要使用 VirtualBox,請用管理者權限執行以下命令,暫時關閉 Hyper-V 功能3:
C:> dism.exe /Online /Disable-Feature:Microsoft-Hyper-V
C:> bcdedit /set hypervisorlaunchtype off
這麼做的缺點是:由於 Docker Desktop for Windows 會用到 Hyper-V 機制,所以,關閉了 Hyper-V,等於是關閉了 Docker Desktop 的使用權。如果稍後還想使用 Docker Desktop,就得手動恢復 Hyper-V 功能:
C:> dism.exe /Online /Enable-Feature:Microsoft-Hyper-V-All
C:> bcdedit /set hypervisorlaunchtype auto
你可能需要在 Hyper-V 與 VirtualBox 模式之間來回切換,也需要重新開機。
虛擬機選項二:Hyper-V
在 Windows 上面玩 VirtualBox 這麼麻煩,換成 Hyper-V 會不會比較省事?
很可惜,我在 “Hyper-V Administrators” 這一關觸礁了。嘗試一些可能的解法4,都無效。
真的有需要時,再回來研究吧。
Vagrant
直接比照 Linux 安裝 Vagrant 的方法。
請在 WSL 底下,直接去官方網站下載安裝檔,或是用 Apt 之類的套件管理系統來安裝。
安裝完畢,請根據官方網站的建議設定環境變數。尤其是 VAGRANT_WSL_ENABLE_WINDOWS_ACCESS
這一項:
export VAGRANT_WSL_ENABLE_WINDOWS_ACCESS="1"
Ansible
直接比照 Linux 安裝 Ansible 的方法。
請在 WSL 底下,照著官方網站的安裝步驟來執行。譬如說,在 Debian/Ubuntu 系列下,可以用 Apt 套件管理系統來安裝。
Ansible + Vagrant
現在,試試看把 Ansible 和 Vagrant 結合起來!
先準備好 Vagrantfile
檔案:
Vagrant.configure(2) do |config|
config.vm.box = "bento/ubuntu-18.04"
config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.provision "ansible" do |ansible|
ansible.compatibility_mode = "2.0"
#ansible.verbose = "vvv"
ansible.playbook = "playbook.yml"
ansible.become = true
end
end
還有 Ansible 的 playbook.yml
檔案:
- hosts: all
become: true
tasks:
- name: install nginx
apt: name=nginx state=present update_cache=yes
試著啟動看看:
% vagrant up
如果一切順利,你可以在 http://localhost:8080/
看到 Nginx 歡迎畫面。
在 Docker + Kubernetes 時代,用到 Ansible 的機會愈來愈少了,Vagrant 更是如此;不過,保有這種工具,在處理還來不及跟上腳步的舊系統仍然很管用。因此,花一點功夫湊出堪用的組合,希望能有順手的 WSL 環境。
-
這段故事,詳見〈在 Windows 上復刻 Mac 使用習慣〉一文。 ↩︎
-
技術上來說,Hyper-V 是屬於 type-1 hypervisor,VirtualBox 是屬於 type-2 hypervisor。詳見維基百科 “Hypervisor” 條目。 ↩︎
-
在 Windows 上關閉 Hyper-V 機制,請參考以下文章:“(Solved) VT-x is Not Available (verr_vmx_no_vmx) in Windows 10 – but Available for Oracle VirtualBox”、〈Win10 10月更新 VirtualBox VT-x is not available (VERR_VMX_NO_VMX). 解决〉、“[Solved] VT-x is not available (VERR_VMX_NO_VMX)”。 ↩︎
-
當 Vagrant 在使用 Hyper-V 時,會出現 “Hyper-V Administrators” 權限問題。我嘗試以下幾篇文章,可惜仍未解決:“Vagrant issue #378”、“Allowing non-Administrators to control Hyper-V–Updated”、“Getting Homestead to play nice with Hyper-V”。 ↩︎