番外篇:在 Windows 上也能使用 Ansible (13:48)

從 Ansible 機器的兩種角色分工談起

Ansible 1.7 之後,managed node(被管理的主機)可以是 Windows 了。相關資訊請見官方文件:http://www.ansible.com/windows

但 Ansible 的 control machine(管理主機;主控台)仍然需要是 Unix-like 系統。引述官方文件的說法:

Reminder: You Must Have a Linux Control Machine

Note running Ansible from a Windows control machine is NOT a goal of the project. Refrain from asking for this feature, as it limits what technologies, features, and code we can use in the main project in the future. A Linux control machine will be required to manage Windows hosts.

Cygwin is not supported, so please do not ask questions about Ansible running from Cygwin.

如果你一定要以 Windows 作為 control machine,有幾種可能的方法。(Disclaimer:以下方法可能都不盡完美,如有可能,還是盡可能找一台 Mac 或 Linux 當做 control machine 吧。)


1. 比較建議的方法:透過虛擬機

利用 VirtualBox 或其他虛擬機軟體,先啟動一份 Linux instance(Debian/Ubuntu/CentOS 皆可),再將 Ansible 安裝在這台虛擬機裡面。這也是 Ansible for DevOps 作者 Jeff Geerling 所推薦的方式。

為了簡化安裝設定虛擬機、安裝 Ansible 等步驟,我製作了一個 Vagrant box: williamyeh/ansible ,可以直接取用。這個 box 的原始程式及使用說明,都放在 GitHub 上面: https://github.com/William-Yeh/ansible-vagrantbox


專案目錄結構

如果要以 williamyeh/ansible 當成 Ansible control machine 的話,建議採用以下的專案目錄結構,替 control machine 獨立出一個專屬目錄:

專案根目錄
│
├── control-machine
│   └── Vagrantfile
│
├── 專案檔案_1
├── 專案檔案_2
├── ...
├──
...

也建議使用以下的 Vagrantfile

Vagrant.require_version ">= 1.8.1"
 
Vagrant.configure(2) do |config|
    config.vm.box = "williamyeh/ansible"
    config.vm.box_version = ">= 2.0.0"
    config.vm.hostname = "ANSIBLE"
 
    if Vagrant::Util::Platform.windows?
       # fix permission for using Windows as host machine
       config.vm.synced_folder "..", "/vagrant",
                               mount_options: ["dmode=775,fmode=664"]
    else
       config.vm.synced_folder "..", "/vagrant"
    end
 
    config.vm.provider "virtualbox" do |vb|
        vb.customize ["modifyvm", :id, "--memory", "256"]
        #vb.gui = true
    end
end

我刻意將 Vagrantfile 裡面的 synced_folder 設定成 parent directory,以便 vagrant ssh ; cd /vagrant 進去之後,不會被困在 control-machine 目錄裡面,可以自由遊走該專案的其他目錄。


當 managed node 是雲端主機時

登入 control machine 之後,即可用正常的 Ansible 指令,設定雲端主機組態。


當 managed node 也是 Vagrant 虛擬機時

很可惜,無法妥善整合 Vagrant 引以為傲的 provisioner 功能(也就是說:vagrant provision 指令無效)。

為了彌補上述缺憾,我設計了一個小工具:vag2inv (Vagrant to Inventory),替其他執行中的 Vagrant 虛擬機動態產生對應的 inventory 檔案,可餵給 Ansible control machine 進一步處理。 同樣的,這個小工具的原始程式及使用說明,也都放在 GitHub 上面: https://github.com/William-Yeh/vag2inv


2. 比較不建議的方法:透過 Cygwin

透過 Cygwin 來安裝 Python,再安裝 Ansible。這種方式(據稱)可以整合 Vagrant 的 provisioner 功能,但可能有許多小問題需要逐一排除。

對這種方式感興趣的,請依序試試以下文章:

  1. Install a Babun (Cygwin) Shell and Ansible for Windows - https://chrisgilbert1.wordpress.com/2015/06/17/install-a-babun-cygwin-shell-and-ansible-for-windows/
  2. ansible-playbook-shim - https://github.com/rivaros/ansible-playbook-shim

Discussion

0 comments