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 的更多信息,请参阅了解特权提升:become。Windows 远程管理的限制部分有关于 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.Windows、Community.Windows和Chocolatey.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
的值应为 cmd
或 powershell
。如果 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 沟通指南