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 子系统 (WSL) 中运行。

注意

Ansible 不支持 Windows 子系统 (WSL),不应将其用于生产系统。

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

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

要从源代码而不是 WSL 上的版本运行 Ansible,只需卸载 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

另一种选择是在运行 Windows 10 版本 2004 或更高版本时使用 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 Update API 和 DPAPI 等内部 Windows API 的访问,而某些安装程序和程序依赖于这些 API。

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

  • 使用 become,它将以本地运行的方式运行命令。这将绕过大多数 WinRM 限制,因为当使用 become 时,Windows 并不知道该进程是在 WinRM 下运行的。请参阅 理解权限提升:become 文档以获取更多信息。

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

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

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

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

此程序无法在 Windows 上通过 Ansible 安装

请参阅 此问题 以获取有关 WinRM 限制的更多信息。

有哪些 Windows 模块可用?

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

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

此外,以下 Ansible Core 模块/action-plugins 也适用于 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(也包括:win_template)

  • wait_for_connection

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

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

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

我能否通过 SSH 连接到 Windows 主机?

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

要使用 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,则使用 powershell

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

除非您如上所述使用 Win32-OpenSSH,否则必须使用 Windows 远程管理 连接到 Windows 主机。如果您的 Ansible 输出表明使用了 SSH,则说明您未正确设置连接变量,或者主机未正确继承这些变量。

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

为什么我的凭据被拒绝?

这可能是由于各种与凭据错误无关的原因造成的。

有关 HTTP 401/凭据被拒绝的更详细指南,请参见 设置 Windows 主机

为什么我收到 SSL CERTIFICATE_VERIFY_FAILED 错误?

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

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

另请参阅

Windows 指南

Windows 文档索引

Ansible playbook

playbook 简介

Ansible 提示和技巧

playbook 提示和技巧

通信

有问题?需要帮助?想分享您的想法?请访问 Ansible 通信指南