即使 Ansible 以 SSH 管理 Linux 节点而闻名,您知道在 Windows 上同样效果出色吗?通过 Windows 远程管理 (WinRM),Ansible 在 Windows 上同样能够有效地管理所有 Windows 节点!
在 Windows 上使用 Ansible,您可以执行诸如部署补丁、管理 Windows 服务器、执行 PowerShell 脚本等任务。
在本教程中,您将学习如何设置您的第一个 Windows 节点以由 Ansible 管理,并了解如何对其运行命令和 Playbooks。
先决条件
如果您想跟随本教程操作,请确保在开始前具备以下条件:
- 一个 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 Remoting 在 PowerShell 內運行遠程命令時使用的相同協議。
截至目前,Ansible 並不支援 SSH 作為管理協議,但目前這是一項實驗性功能。
為了讓 Ansible 使用 WinRM 與 Windows 節點通訊,您必須配置 WinRM。為此,Ansible 提供了一個 PowerShell 腳本 來設置各種 WinRM 選項。
儘管 Red Hat 提供的配置 WinRM 的 PowerShell 腳本 已經過測試且安全,但您應該通過閱讀並理解其正在執行的高層次操作。
您的第一個任務將是下載配置腳本並在 Windows 節點上運行 Ansible。為此,假設您的目標 Windows 電腦已啟用了 PowerShell Remoting,且您正在 Windows 工作站上:
下載ConfigureRemotingForAnsible.ps1 PowerShell指令碼到您本地的Windows電腦。本教程將假設它已保存在〜\Downloads中。
在Windows節點上執行配置腳本,Ansible將使用Invoke-Command
命令進行管理。下面的命令將在教程的兩個演示機器上運行該命令,並提示您輸入Windows節點上本地adminuser帳戶的密碼。
默認情況下,配置腳本將為基本HTTP身份驗證配置WinRM。如果您希望Ansible使用更安全的連接,請參閱如何為Ansible配置WinRM over HTTPS。
配置Ansible在Windows上的控制器
現在Windows節點已準備好供Ansible使用,現在讓我們配置Ansible控制器,以向Ansible顯示如何與其通信。
1. 使用您喜歡的SSH客戶端通過SSH連接到您的Ansible控制器主機。
2. 安裝pywinrm Python模塊。對於Ansible在Windows上通過WinRM協議與主機通信,需要pywinrm Python模塊。
3. 在Ansible清單檔案中定義遠端的Windows節點。 Ansible清單是在檔案中定義的遠端主機集合,可以使用主機名稱或IP位址來定義。 一旦定義,您就可以使用指令和Playbooks針對Ansible清單執行操作,很快您就會看到。
預設的Ansible清單檔案位於/ etc / ansible / hosts目錄中。
下面的示例清單檔案創建了一個windows
主機組,其中包含每個Windows節點。本教程在這裡使用主機組,以便稍後更輕鬆地一次性定位所有Windows節點(如果您有多個)。
4. 接下來,在清單檔案中定義一些必要的變數,這些變數將作為windows:vars
組在連接到Windows主機時由Ansible使用。
5. 現在,使用 Ansible win_ping 模組 對在步驟 #3 定義的 windows
主機組內的主機執行簡單的連線測試。
執行後,您可以看到下面 Ansible 返回綠色文字,顯示成功的 ping 嘗試。

輸出確認了 Ansible 控制器主機能夠通過 WinRM 成功與 Windows 遠端主機通信。
在 Windows 主機上運行臨時命令
此時,您已經設置好 Ansible 開始控制您的 Windows 节點。現在,讓我們通過在 Windows 节點上運行臨時命令來測試一下。當您需要在未首先創建playbook的情況下在節點上運行簡單命令時,臨時命令非常有用。
讓我們通過在清單文件中定義的 windows
主機組中安裝 Windows 功能來演示臨時命令。為此,假設您仍然連接到 Ansible 控制器節點:
1. 這次不使用 win_ping 模組,改用 win_feature 模組(-m
),傳遞兩個參數(-a
),分別是 name
和 state
,指定 Windows 功能的名稱和您想要的狀態。
執行以上命令後,如果一切順利,Ansible 應該會連接到 windows
主機組中的所有節點,並在每個節點上執行 win_feature 命令,檢查並安裝 Telnet-Client
Windows 功能(如果不存在的話)。

2. Ansible 顯示成功,但為了確保,請手動使用 PowerShell 連接到 Windows 節點,並驗證是否已安裝了 Telnet Client Windows 功能。在您的本地 Windows 工作站上,執行 Invoke-Command
以在每台 Windows 電腦上執行 Get-WindowsFeature
PowerShell 命令。
此時,您可以運行 任何想要的 Windows 模組 作為即時命令!
在 Windows 上建立和執行 Ansible Playbooks
一旦您掌握了在Windows管理节点上运行临时命令的技巧,下一个任务是创建和运行playbook。Ansible playbook将命令组合到一个地方,并允许您编写复杂逻辑来执行复杂的自动化场景。
使用win_command模块运行远程Windows命令
假设您仍然连接到Ansible控制器主机:
1. 在主目录下创建一个名为ansible-windows-demo的文件夹,并切换到该文件夹。该文件夹将保存您的playbook。
2. 打开您喜欢的文本编辑器,创建并保存一个名为ansible-windows.yml的文件,保存在~/ansible-windows-demo目录中。
Ansible playbook是用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 控制器主機並再次打開您喜歡的文本編輯器。這次,創建並保存另一個 playbook,名為 ansible-windows-shell.yml,保存在相同的 ~/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 的 Ansible?