Windows 常见问题解答

以下是关于 Ansible 和 Windows 的一些常见问题及其答案。

注意

本文档涵盖使用 Ansible 管理 Microsoft Windows 服务器时遇到的问题。有关 Ansible Core 的问题,请参阅 常见问题解答页面.

Ansible 是否支持 Windows XP 或 Server 2003?

Ansible 不支持 Windows XP 或 Server 2003 主机。Ansible 支持以下 Windows 操作系统版本:

  • Windows Server 2016

  • Windows Server 2019

  • Windows Server 2022

  • Windows 10

  • Windows 11

对 Windows Server 2008、2008 R2 和 Windows 7 的支持在 2.10 版本中结束。对 Windows Server 2012、2012 R2、Windows 8 和 8.1 的支持在 2.16 版本中结束。

Ansible 对 PowerShell 版本也有最低要求 - 请参阅 设置 Windows 主机 获取最新信息。

我可以用 Ansible 管理 Windows Nano Server 吗?

Ansible 目前不支持 Windows Nano Server,因为它无法访问大多数模块和内部组件使用的完整 .NET Framework。

Ansible 能在 Windows 上运行吗?

不能,Ansible 只能管理 Windows 主机。Ansible 无法在 Windows 主机上本地运行,但它可以在 Windows 子系统 for Linux (WSL) 下运行。

注意

Ansible 不支持 Windows 子系统 for Linux,它不应用于生产系统。

要在 WSL 上安装 Ansible,可以在 bash 终端中运行以下命令:

sudo apt-get update
sudo apt-get install python3-pip git libffi-dev libssl-dev -y
pip install --user ansible pywinrm

要从源代码运行 Ansible 而不是在 WSL 上运行版本,只需卸载 pip 安装的版本,然后克隆 git 仓库。

pip uninstall ansible -y
git clone https://github.com/ansible/ansible.git
source ansible/hacking/env-setup

# To enable Ansible on login, run the following
echo ". ~/ansible/hacking/env-setup -q' >> ~/.bashrc

如果在 WSL 上运行 Ansible 时遇到超时错误,这可能是由于 sleep 未正确返回导致的。以下解决方法可以解决此问题:

mv /usr/bin/sleep /usr/bin/sleep.orig
ln -s /bin/true /usr/bin/sleep

另一个选择是,如果运行的是构建 2004 之后的 Windows 10,则可以使用 WSL 2。

wsl --set-default-version 2

我可以使用 SSH 密钥来验证 Windows 主机吗?

您无法将 SSH 密钥与 WinRM 或 PSRP 连接插件一起使用。这些连接插件使用 X509 证书进行身份验证,而不是 SSH 使用的 SSH 密钥对。

X509 证书的生成和映射到用户的方式不同于 SSH 实现;请参阅 Windows 远程管理 文档以获取更多信息。

Ansible 2.8 添加了一个实验性选项,可以使用 SSH 连接插件(使用 SSH 密钥进行身份验证)来管理 Windows 服务器。有关更多信息,请参阅 此问题.

为什么我在本地可以运行的命令在 Ansible 下无法运行?

Ansible 通过 WinRM 执行命令。这些进程不同于在本地运行命令,具体表现在以下方面:

  • 除非使用像 CredSSP 或 Kerberos 这样的身份验证选项以及凭据委派,否则 WinRM 进程无法将用户的凭据委派给网络资源,从而导致 Access is Denied 错误。

  • 在 WinRM 下运行的所有进程都在非交互式会话中。需要交互式会话的应用程序将无法正常工作。

  • 通过 WinRM 运行时,Windows 会限制对内部 Windows API 的访问,例如 Windows 更新 API 和 DPAPI,一些安装程序和程序依赖于这些 API。

一些绕过这些限制的方法是:

  • 使用 become,它会像在本地运行一样运行命令。这将绕过大多数 WinRM 限制,因为 Windows 在使用 become 时并不知道进程是在 WinRM 下运行的。有关更多信息,请参阅 理解特权升级:become 文档。

  • 使用 win_scheduled_task 创建一个计划任务。与 become 类似,它将绕过所有 WinRM 限制,但它只能用于运行命令,不能用于运行模块。

  • 使用 win_psexec 在主机上运行命令。PSExec 不使用 WinRM,因此将绕过任何限制。

  • 要访问网络资源,无需任何这些解决方法,您可以使用 CredSSP 或 Kerberos 以及启用凭据委派。

有关如何使用 become 的更多信息,请参阅 理解特权升级:becomeWindows 远程管理 中的限制部分提供了有关 WinRM 限制的更多详细信息。

这个程序无法使用 Ansible 在 Windows 上安装

有关 WinRM 限制的更多信息,请参阅 此问题.

有哪些可用的 Windows 模块?

Ansible Core 中的大多数 Ansible 模块都是为 Linux/Unix 机器和任意 Web 服务的组合编写的。这些模块是用 Python 编写的,大多数模块在 Windows 上无法正常工作。

因此,有一些专门的 Windows 模块是用 PowerShell 编写的,旨在在 Windows 主机上运行。这些模块的列表可以在 此处 找到。

此外,以下 Ansible Core 模块/操作插件适用于 Windows:

  • add_host

  • assert

  • async_status

  • debug

  • fail

  • fetch

  • group_by

  • include

  • include_role

  • include_vars

  • meta

  • pause

  • raw

  • script

  • set_fact

  • set_stats

  • setup

  • slurp

  • template (also: win_template)

  • wait_for_connection

Ansible Windows 模块存在于 Ansible.WindowsCommunity.WindowsChocolatey.Chocolatey 集合中。

我可以在 Windows 主机上运行 Python 模块吗?

不能,WinRM 连接协议设置为使用 PowerShell 模块,因此 Python 模块将无法正常工作。解决此问题的一种方法是使用 delegate_to: localhost 在 Ansible 控制节点上运行 Python 模块。如果在剧本中需要联系外部服务,并且没有可用的等效 Windows 模块,这将很有用。

我可以通过 SSH 连接到 Windows 主机吗?

Ansible 2.8 添加了一个实验性选项,可以使用 SSH 连接插件来管理 Windows 主机。要通过 SSH 连接到 Windows 主机,您必须在 Windows 主机上安装和配置正在与 Microsoft 一起开发的 Win32-OpenSSH 分支。虽然大多数基本功能应该可以使用 SSH,但 Win32-OpenSSH 正在快速变化,每个版本都会添加新功能和修复错误。强烈建议您从 GitHub 发布页面上 安装 最新版本的 Win32-OpenSSH,并在 Windows 主机上使用它与 Ansible 一起使用。

要使用 SSH 作为到 Windows 主机的连接,请在库存中设置以下变量:

ansible_connection=ssh

# Set either cmd or powershell not both
ansible_shell_type=cmd
# ansible_shell_type=powershell

ansible_shell_type 的值应为 cmdpowershell。如果 SSH 服务上未配置 DefaultShell,请使用 cmd;如果将其设置为 DefaultShell,请使用 powershell

为什么通过 SSH 连接到 Windows 主机失败?

除非您使用上述的 Win32-OpenSSH,否则您必须使用 Windows 远程管理 连接到 Windows 主机。如果您的 Ansible 输出表明使用了 SSH,那么要么您没有正确设置连接变量,要么主机没有正确继承它们。

确保在 Windows 主机的清单中设置了 ansible_connection: winrm

为什么我的凭据被拒绝?

这可能是由于各种与凭据不正确无关的原因造成的。

有关此问题的更多详细信息,请参阅 设置 Windows 主机 中的 HTTP 401/凭据被拒绝。

为什么我收到 SSL CERTIFICATE_VERIFY_FAILED 错误?

当 Ansible 控制节点运行在 Python 2.7.9+ 或更早版本的 Python 上(该版本已反向移植了 SSLContext,例如 RHEL 7 上的 Python 2.7.5),控制节点将尝试验证 WinRM 用于 HTTPS 连接的证书。如果无法验证证书(例如,自签名证书),则验证过程将失败。

要忽略证书验证,请在 Windows 主机的清单中添加 ansible_winrm_server_cert_validation: ignore

另请参见

Windows 指南

Windows 文档索引

Ansible playbook

Ansible playbook 简介

Ansible 的技巧和窍门

playbook 的技巧和窍门

用户邮件列表

有问题吗?来 Google 群组吧!

实时聊天

如何加入 Ansible 聊天频道