既然要開始在 Windows 上沿用 Mac 及 Unix 的命令列工具習慣1,免不了要處理 AnsibleVagrant

雖然這兩個軟體都有對應的 Windows 版本,但據我以前的經驗,卡卡的,有許多小地雷;畢竟這些發跡自泛 Unix 家族的軟體,不是那麼容易無縫移植到對命令列不友善的 Windows 家族。

如今 Windows 已經有 WSL (Windows Subsystem for Linux) 機制,是否可以更無痛享用 Ansible 及 Vagrant 呢?

可以的。

大體而言,我們會兵分二路:

虛擬機選項一: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 環境。


  1. 這段故事,詳見〈在 Windows 上復刻 Mac 使用習慣〉一文。 [return]
  2. 技術上來說,Hyper-V 是屬於 type-1 hypervisor,VirtualBox 是屬於 type-2 hypervisor。詳見維基百科 “Hypervisor” 條目。 [return]
  3. 在 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)”。 [return]
  4. 當 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”。 [return]