关于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服务器上手动验证这个重定向问题:
- 打开32位PowerShell(路径:
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe) - 执行
Test-Path C:\Windows\System32\drivers\etc\hosts,会返回False - 再打开64位PowerShell(路径:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe) - 执行同样的命令,会返回
True
内容的提问来源于stack exchange,提问作者Sergey
相关产品推荐
相关产品推荐

