我们希望听到您的声音!帮助我们洞悉 Ansible 生态系统的现状。
参加 Ansible 项目调查 2024

连接到 Windows 主机

连接到 Windows 主机

欢迎来到我们的 Windows 专属入门系列的第一期!

您是否想使用 Red Hat Ansible Tower 自动化一些 Windows 主机,但不知道如何设置一切?您是否担心 Red Hat Ansible Engine 无法与您的 Windows 服务器通信,而无需安装大量额外的软件?您是否想轻松地自动化每个人最好的朋友 Clippy?

Ansible-Windows-Clippy

我们无法帮助解决最后一件事情,但如果您对其他两个问题回答了肯定,那么您来对地方了。在这篇文章中,我们将引导您完成设置和使用 Ansible Engine 连接到 Windows 主机所需的所有步骤。

为什么要自动化 Windows 主机?

您可以使用 Ansible Engine 为 Windows 主机执行的众多操作中的一部分包括

  • 启动、停止和管理服务
  • 推送和执行自定义 PowerShell 脚本
  • 使用 Chocolatey 包管理器管理包

除了使用本地或域用户连接到 Windows 主机并对其进行自动化外,您还可以使用 runas 以管理员身份执行操作(Windows 中的 sudosu 的替代方案),因此不会丢失任何特权提升功能。

需要什么?

在我们开始之前,让我们回顾一下 基本要求。首先,您的控制机(Ansible Engine 将从这里执行您选择的 Windows 模块)需要运行 Linux。其次,Windows 支持一直在快速发展,因此请确保使用最新版本的 Ansible Engine 以获取最新功能!

对于目标主机,您应该至少运行 Windows 7 SP1 或更高版本或 Windows Server 2008 SP1 或更高版本。您不希望运行 90 年代的东西,比如 Windows NT,因为可能会发生这种情况

Ansible-Windows-90s

最后,由于 Ansible 通过使用 Windows 远程管理 (WinRM) 连接到 Windows 机器并运行 PowerShell 脚本(作为 Linux/Unix 机器上 SSH 的替代方案),因此应创建和激活 WinRM 监听器。好消息是,可以使用脚本非常轻松快捷地连接到 Windows 主机,我们将在下面的部分中讨论这一点。

步骤 1:设置 WinRM

什么是 WinRM?它是 Windows Vista 及更高版本的一项功能,允许管理员远程运行管理脚本;它通过实现基于 简单对象访问协议 (通常称为 SOAP) 的 WS-Management 协议来处理这些连接。使用 WinRM,您可以执行一些很酷的操作,例如作为网络管理员访问、编辑和更新本地和远程计算机上的数据。

WinRM 非常适合与 Ansible Engine 一起使用的原因是,您可以从运行在非 Windows 操作系统(在本例中为 Linux)上的 WS-Management 协议实现中获取硬件数据。它基本上就像一个翻译器,允许不同类型的操作系统协同工作。

那么,我们如何连接?

在大多数版本的 Windows 中,WinRM 都包含在系统中,但默认情况下未启用。您可以使用一个 为 Ansible 配置远程访问 脚本,在远程 Windows 机器上运行此脚本(在 PowerShell 控制台中以管理员身份运行)以启用 WinRM。要设置 https 监听器、构建自签名证书并执行 PowerShell 命令,只需像下面示例中那样运行脚本即可(如果您在本地机器上存储了 .ps1 文件)

Ansible-Windows-Powershell

注意:win_psexec 模块将帮助您在您环境中需要设置大量 Windows 主机的情况下,在多台机器上启用 WinRM。

有关 WinRM 和 Ansible 的更多信息,请查看 Windows 远程管理 文档页面。

步骤 2:安装 Pywinrm

由于 pywinrm 依赖项不随 Ansible Engine 一起提供(这些依赖项对于使用 WinRM 是必需的),因此请确保在安装了 Ansible 的机器上安装与 pywinrm 相关的库。最简单的方法是在您的终端中运行 pip install pywinrm

步骤 3:正确设置您的清单文件

为了正确连接到 Windows 主机,您需要确保在清单文件的 主机变量 部分中输入 ansible_connection=winrm,这样 Ansible Engine 不会一直尝试通过 SSH 连接到 Windows 主机。

此外,WinRM 连接插件默认通过 https 进行通信,但它支持不同的模式,例如消息加密的 http。由于我们之前运行的“为 Ansible 配置远程访问”脚本使用自签名证书设置了内容,因此我们需要告诉 Python,“不要尝试验证此证书,因为它不是来自有效 CA 的”。因此,为了防止出现错误,您还需要在 主机变量 部分中输入:ansible_winrm_server_cert_validation=ignore

为了让您在一个地方看到它,这里是一个示例主机文件(请注意,您的特定环境的一些详细信息将有所不同)

[win]
172.16.2.5
172.16.2.6

[win:vars]
ansible_user=vagrant
ansible_password=password
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore

步骤 4:测试连接

让我们检查一下一切是否正常。为此,请转到您的控制节点的终端并键入 ansible [清单文件中主机组名称] -i hosts -m win_ping。您的输出应如下所示

Ansible-Windows-Screen-Grab

注意:所有 Windows 模块上的 win_ 前缀表明它们是用 PowerShell 而不是 Python 实现的。

WinRM 故障排除

由于 WinRM 可以以多种不同的方式配置,因此看似与 Ansible Engine 相关的错误实际上可能是由于主机设置问题导致的。您可能会看到的一些 WinRM 错误示例包括 HTTP 401 或 HTTP 500 错误、超时问题或连接拒绝。要获得有关如何解决这些问题的提示,请访问 Windows 设置文档页面的 常见 WinRM 问题 部分。

结论

您现在应该可以使用 Ansible 自动化 Windows 主机,而无需安装大量额外的软件!但请记住,即使您遵循了上面的说明,一些 Windows 模块也有一些额外的规范(例如,更新的操作系统或更新的 PowerShell 版本)。找出您是否满足正确要求的最佳方法是检查 特定于模块的 文档页面。

有关如何使用 Ansible Engine 自动化 Windows 主机的更深入信息,请查看我们的 Windows 常见问题解答Windows 支持 文档页面,并继续关注更多与 Windows 相关的博客文章!