即使Ansible以使用SSH管理Linux節點而聞名,你知道Ansible在Windows上同樣運作良好嗎?使用Windows遠端管理(WinRM),Ansible在Windows上也能有效地管理你所有的Windows節點!
使用Ansible在Windows上,你可以執行諸如部署補丁、管理Windows伺服器、執行PowerShell腳本等任務。
在本教程中,你將學習如何設置你的第一個Windows節點以被Ansible管理,並看到如何對其運行命令和劇本。
先決條件
如果你想跟隨本教程,請確保在開始前具備以下條件:
- 一個Ansible控制主機 – 本教程將使用Ansible v2.9.18在一台Ubuntu 18.04.5 LTS機器上,其IP地址為10.111.4.53。注意,Windows不支持作為控制節點,只支持作為被管理節點。
- 在你的Ansible控制主機上安裝了Python – 本教程將使用Python v2,但v3應該也同樣適用。
- 在Ansible控制器上安裝了pip包。
- A Windows 2012 R2 or greater computer for Ansible to manage – This tutorial will use two Windows Server 2012 R2 Standard machines as remote nodes with IP addresses of 52.242.251.213 and 10.111.4.106.
- A Windows workstation – This tutorial will perform some basic pre-configuration to the node that Windows will manage with Ansible and will require you to sitting at a Windows workstation.
- 要管理的Windows伺服器已經啟用了PowerShell遠程
- A user account in the local Administrators group on the Windows computer. This tutorial will use an account called adminuser.
在Windows上設置WinRM監聽器
在 Ansible 能夠與遠端 Windows 節點通訊之前,它必須能夠與其建立連線。它通過 Microsoft 協議 WinRM 來實現這一點。WinRM 是同樣的協議,PowerShell 遠端 在 PowerShell 內部運行遠程命令時使用的協議。
截至目前為止,Ansible 確實 支援 SSH 作為管理協議,但這是一項實驗性功能。
為了讓 Ansible 使用 WinRM 與 Windows 節點通訊,您必須配置 WinRM。為此,Ansible 提供了 一個 PowerShell 腳本,該腳本設置了各種 WinRm 選項。
雖然 Red Hat 提供的用於配置 WinRM 的 PowerShell 腳本 已經過測試並且安全,但您應該閱讀並理解其大致作用。
您的第一個任務將是下載配置腳本並在 Windows 節點上運行 Ansible。為此,假設您已經在目標 Windows 電腦上啟用了 PowerShell 遠端 且您正在 Windows 工作站上:
將 ConfigureRemotingForAnsible.ps1 PowerShell 腳本 下載到您的本地 Windows 電腦。本教程將假設它已保存在 〜\Downloads。
在將 Ansible 管理的 Windows 節點上運行配置腳本,使用 Invoke-Command
命令。以下命令將在教程的兩個演示機器上運行該命令,並提示您輸入 Windows 節點上本地 adminuser 帳戶的密碼。
默認情況下,配置腳本將為基本的 HTTP 身份驗證配置 WinRM。如果您希望 Ansible 使用更安全的連接,請查看 如何為 Ansible 配置 WinRM over HTTPS。
在 Windows 上配置 Ansible 控制器
現在 Windows 節點已準備好供 Ansible 使用,讓我們現在配置 Ansible 控制器,告訴 Ansible 如何與其通信。
1. 使用您喜歡的 SSH 客戶端通過 SSH 連接到您的 Ansible 控制器主機。
2. 安裝 pywinrm Python 模塊。pywinrm Python 模塊是 Ansible 在 Windows 上通過 WinRM 協議與主機通信所需的。
在Ansible清單文件中定義遠程Windows節點。 Ansible清單是一個由文件中的主機名稱或IP地址定義的遠程主機集合。 一旦定義,您就可以使用命令和播放書來針對Ansible清單進行操作,您很快就會看到。
默認的Ansible清單文件位於/etc/ansible/hosts目錄中。
下面的示例清單文件創建了一個windows
主機組,其中包含每個Windows節點。 教程在這裡使用主機組是為了以後更容易一次性定位所有Windows節點(如果您有多個)。
4. 接下來,在清單文件中定義幾個Ansible在連接到Windows主機時將使用的必需變量,作為windows:vars
組。
5. 現在,使用 Ansible 的 win_ping 模組來執行一個簡單的連線測試,針對步驟#3 中定義的 windows 主機組內的主機。
執行後,您可以看到以下 Ansible 返回綠色文字,並顯示成功訊息,表示 ping 嘗試成功。

輸出確認 Ansible 控制器主機能夠通過 WinRM 成功與 Windows 遠程主機通信。
在 Windows 主機上執行即時命令
此時,您已經準備好讓 Ansible 開始控制您的 Windows 節點。現在讓我們通過在 Windows 節點上運行即時命令來測試一下。當您需要在未首先創建 playbook 的節點上運行簡單命令時,即時命令非常有用。
讓我們通過在庫存檔案中定義的 windows 主機組中的 Windows 節點上安裝 Windows 功能來演示即時命令。為此,假設您仍然 SSH 到您的 Ansible 控制器節點:
1. 這次不使用 win_ping 模組,而是呼叫 win_feature 模組(-m
),並傳遞兩個參數(-a
),分別表示 Windows 功能的名稱和您希望它處於的狀態。
執行上述命令後,如果一切順利,Ansible 應該會連接到 windows
主機組中的所有節點,並在每個節點上運行 win_feature 命令,檢查是否存在 Telnet-Client,如果不存在,則安裝。

2. Ansible 顯示成功,但為確保,請手動連接到 Windows 節點,使用 PowerShell 驗證 Telnet Client Windows 功能是否已安裝。在本地 Windows 工作站上,運行 Invoke-Command
以在每台 Windows 電腦上運行 Get-WindowsFeature
PowerShell 命令。
此時,您可以運行任何您喜歡的 Windows 模組作為即席命令!
創建並運行 Ansible 在 Windows 上的 Playbooks
一旦您掌握了在Windows管理節點上運行即席命令的技巧,您的下一個任務就是創建並運行playbooks。 Ansible playbook將命令組合到一個地方,並允許您編寫複雜的邏輯以執行複雜的自動化場景。
使用win_command模塊運行遠程Windows命令
假設您仍然連接到您的Ansible控制器主機:
1. 在您的家目錄下創建一個名為ansible-windows-demo的文件夾,並切換到該文件夾。此文件夾將保存您的playbook。
2. 打開您喜歡的文本編輯器,並創建並保存一個名為ansible-windows.yml的文件到 ~/ansible-windows-demo 目錄下。
Ansible playbooks是用YAML編寫的。
3. 現在,將下面的playbook複製到ansible-windows.yml文件中以創建一個單獨的任務。此playbook將使用win_command Windows Ansible模塊在windows
主機組中的所有主機上執行netstat Windows命令。
win_command 模块在 Windows 远程主机上执行命令。它不允许包含变量的命令,例如特殊字符、换行符、大于符号等。
4. 调用 ansible-windows.yml playbook,通过运行以下命令在远程主机上执行任务。
如果一切顺利,您应该看到如下输出。

使用 win_shell 模块运行远程 PowerShell 命令
您已经创建了一个 playbook,以在上一个示例中管理的 Windows 节点上运行远程 cmd.exe 命令 (netstat
)。现在让我们再提高一点难度,使用 win_shell 模块来运行 PowerShell 命令。
默认情况下,win_shell 模块在 Windows 主机上运行 PowerShell。
在您的本地 Windows 工作站上:
1. 首先,在您的本地 Windows 工作站上打开您喜欢的文本编辑器,创建一个示例 PowerShell 脚本,并将以下代码复制到其中,保存为 one.ps1。本教程将把脚本保存到 ~\one.ps1。
以下代码在 C:\temp 目录中创建一个名为 test2.txt 的空文本文件。
2. 使用您首选的方法将 one.ps1 PowerShell 脚本复制到您的 Windows 管理节点。本教程将假定您已将 one.ps1 脚本复制到每个 Windows 节点上的 C:\Temp 文件夹中。
3. 一旦示例 PowerShell 脚本位于 Windows 节点上,连接到您的 Ansible 控制器主机,并再次打开您喜欢的文本编辑器。这次,创建并保存另一个名为 ansible-windows-shell.yml 的 playbook,保存在相同的 ~/ansible-windows-demo 目录中。
4. 将以下 playbook 复制并粘贴到 ansible-windows-shell.yml 文件中。此 playbook 将运行两个任务来演示 win_shell 模块。它调用从第 2 步刚刚复制的 PowerShell 脚本,并直接将 PowerShell 代码插入 playbook 中,以演示根本不需要脚本。
要将多行 PowerShell 代码传递给 win_shell 模块,请使用
|
管道字符。
5. 现在,调用第二个 playbook ansible-windows-shell.yml,它在远程主机上执行,但使用 PowerShell。

6. 如有必要,在您的本地 Windows 工作站上验证 playbook 是否执行了现有脚本以及 playbook 中的 PowerShell 代码。
如果 Ansible playbook 运行成功,PowerShell 应返回两个 True
语句,指示文件现在已存在。
结论
在本教程中,您已经学会了如何在 Ansible 中设置第一个 Windows 受控节点。尽管 Ansible 传统上被视为 Linux 工具,但它也可以轻松用于 Windows!
您将开始使用哪些 playbook 和 Windows 模块来管理 Windows ?