Windows 常见问题解答

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

注意

本文档涵盖有关使用 Ansible 管理 Microsoft Windows 服务器的问题。有关 Ansible Core 的问题,请参阅通用 FAQ 页面

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 主机上本机运行,但可以在 Linux 的 Windows 子系统 (WSL) 下运行。

注意

Ansible 不支持 Linux 的 Windows 子系统,不应将其用于生产系统。

要在 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 API 的访问,如 Windows Update API 和 DPAPI,某些安装程序和程序依赖于这些 API。

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

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

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

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

  • 要在不使用任何这些解决方法的情况下访问网络资源,可以使用 CredSSP 或启用了凭据委派的 Kerberos。

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

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

有关 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 (也: 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 正在快速变化,每个版本都会添加新功能和修复错误。强烈建议您从 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+ 或具有回移植 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 沟通指南