番外篇:在 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 功能,但可能有許多小問題需要逐一排除。
對這種方式感興趣的,請依序試試以下文章:
- 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/
- ansible-playbook-shim - https://github.com/rivaros/ansible-playbook-shim
0 comments