即使 Ansible 以使用 SSH 管理 Linux 节点而闻名,您是否知道 Ansible 在 Windows 上同样表现出色?使用 Windows 远程管理(WinRM),Ansible 在 Windows 上也能有效地管理您的所有 Windows 节点!
在 Windows 上使用 Ansible,您可以执行部署补丁、管理 Windows 服务器、执行 PowerShell 脚本等任务。
在本教程中,您将学习如何设置您的第一个 Windows 节点,以便使用 Ansible 进行管理,并了解如何针对其运行命令和 Playbook。
先决条件
如果您想跟着本教程学习,请确保在开始之前具备以下条件:
- An Ansible 控制器主机 – 本教程将使用 Ansible v2.9.18,在具有 IP 地址为 10.111.4.53 的 Ubuntu 18.04.5 LTS 机器上进行。请注意,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 Remoting。
截至撰写本文时,Ansible 确实 支持 SSH 作为管理协议,但目前仍然是一个实验性功能。
为了让 Ansible 使用 WinRM 与 Windows 节点通信,您必须配置 WinRM。为此,Ansible 提供了 一个 PowerShell 脚本 来设置各种 WinRM 选项。
尽管红帽提供的用于配置 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。
配置Windows上的Ansible控制器
现在Windows节点已经准备好供Ansible使用,让我们现在配置Ansible控制器以向Ansible展示如何与其通信。
1. 使用您喜欢的SSH客户端通过SSH连接到您的Ansible控制器主机。
2. 安装pywinrm Python模块。pywinrm Python模块是Windows上的Ansible通信到主机需要使用WinRM协议的必备模块。
在Ansible清单文件中定义远程Windows节点。Ansible清单是一个通过主机名或IP地址在文件中定义的远程主机集合。一旦定义,您就可以使用命令和playbook来针对Ansible清单进行操作,就像您很快就会看到的那样。
默认的Ansible清单文件位于/etc/ansible/hosts目录中。
下面的示例清单文件创建了一个名为windows
的主机组,其中包含每个Windows节点。本教程在这里使用主机组是为了稍后更容易地一次性定位所有Windows节点(如果您有多个)。
接下来,在清单文件中定义一些连接到Windows主机时Ansible将使用的必需变量作为windows:vars
组。
5. 现在,使用 Ansible 的 win_ping 模块 执行一个简单的连接测试,测试目标是在步骤#3中定义的 windows
主机组中的主机。
执行完毕后,你可以在下面看到 Ansible 返回的绿色文本,其中包含一个成功的 ping 尝试的消息。

输出确认了 Ansible 控制主机能够通过 WinRM 与 Windows 远程主机成功通信。
在 Windows 主机上运行即时命令
此时,你已经准备好让 Ansible 开始控制你的 Windows 节点了。现在让我们通过在 Windows 节点上运行一个 即时命令 来测试一下。即时命令在你需要在节点上运行简单命令而无需首先创建 playbook 时非常方便。
让我们通过在清单文件中定义的 windows
主机组上安装一个 Windows 功能来演示即时命令。为此,假设你仍然通过 SSH 登录到你的 Ansible 控制节点:
1. 这次不再使用 win_ping 模块,而是调用 win_feature 模块(-m
),传递两个参数(-a
),分别表示 Windows 功能的名称和您希望的状态。
当您运行上述命令时,如果一切顺利,Ansible 应该会连接到 windows
主机组中的所有节点,并在每个节点上运行 win_feature 命令,检查并安装 Telnet-Client
Windows 功能(如果尚未安装)。

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 目录中。
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,该playbook在远程主机上执行,但使用PowerShell。

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