You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Ansible win_template模块无法识别Windows指定路径的问题咨询

解决Ansible win_template写入Windows System32目录报错的问题

这个问题我之前排查过,核心是Windows的**文件系统重定向(File System Redirector)**在暗中影响,下面给你拆解原因和两种可行的解决办法:

问题根源

Windows为了兼容32位程序,做了一个特殊的路径重定向机制:

  • 当32位进程尝试访问C:\Windows\System32时,系统会偷偷把请求重定向到C:\Windows\SysWOW64目录(这个目录是存放32位系统文件的)
  • Ansible默认通过WinRM连接Windows时,使用的是32位版本的PowerShell/WinRM服务,所以你指定的C:\windows\system32\drivers\etc\hosts,实际被访问的是C:\Windows\SysWOW64\drivers\etc——而这个目录下默认是没有hosts文件的,自然就会报“找不到文件或目录”的错误
  • 至于win_service这类模块能正常工作,是因为它们操作的是系统服务管理接口,不涉及文件系统的路径重定向逻辑

解决办法

方法一:用Sysnative虚拟目录绕过重定向

直接修改任务中的目标路径,把system32替换成Sysnative即可:

- name: copy hosts
  win_template:
    src: hosts
    dest: C:\Windows\Sysnative\drivers\etc\hosts
- name: copy bootstrap.yaml
  win_template:
    src: bootstrap.yaml.j2
    dest: "C:\\Service\\bootstrap.yml2"
  notify: restart

Sysnative是Windows专门给32位进程提供的“后门”——只有32位进程访问它时,会直接指向真正的64位System32目录,完美适配当前场景。

方法二:强制Ansible使用64位WinRM端点

修改你的Ansible inventory配置,给Windows主机添加ansible_winrm_64bit=true参数,让Ansible调用64位的PowerShell进程执行任务:

[win-01]
win-01 ansible_host=你的Windows服务器IP ansible_connection=winrm ansible_winrm_transport=ntlm ansible_winrm_port=5986 ansible_winrm_scheme=https ansible_winrm_server_cert_validation=ignore ansible_winrm_64bit=true

或者在playbook的变量中直接设置:

- hosts: win-01
  vars:
    ansible_winrm_64bit: true
  roles:
    - win

这样配置后,Ansible访问C:\Windows\System32就会直接指向真实的64位目录,不需要修改原路径。

验证方式(可选)

你可以在Windows服务器上手动验证这个重定向问题:

  1. 打开32位PowerShell(路径:C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe)
  2. 执行Test-Path C:\Windows\System32\drivers\etc\hosts,会返回False
  3. 再打开64位PowerShell(路径:C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe)
  4. 执行同样的命令,会返回True

内容的提问来源于stack exchange,提问作者Sergey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 03:12:32