Ansible win_find访问Windows共享文件夹失败的问题解决咨询
问题描述
已连接至共享文件夹\\10.14.2.130\shared\,尝试使用Ansible的win_find模块搜索其中Data文件夹内的文件,任务代码如下:
- name: Search for files in Data folder win_find: paths: \\10.14.2.130\shared\folder\Data\ register: file1
预期该任务能检测到文件夹内的文件,但在主机10.12.201.60上执行时出现警告:
[WARNING]: Argument path '\10.14.2.130\shared\folder\Data' does not exist or is not accessible, skipping
且未检测到任何文件。但在共享文件夹所在主机10.14.2.130上执行相同任务时,可正常检测到sample.csv文件。
用于连接共享文件夹的任务代码如下:
- name: Connect to shared folder win_command: 'net use Z: \\10.14.2.130\shared\ /user:username passwordhere /p:yes' become: yes become_method: runas become_user: SYSTEM
检查发现映射驱动器Z:在文件资源管理器中显示为已断开,但手动点击仍可查看文件。疑问:是否因驱动器断开导致Ansible无法识别路径?如何通过Ansible成功连接驱动器以实现文件搜索?
问题分析与解决方法
核心原因
- 用户上下文隔离:使用
become_user: SYSTEM执行net use时,驱动器映射仅绑定在SYSTEM账户的会话中,而Ansible默认以WinRM连接用户的上下文执行后续任务,两个上下文的驱动器映射不共享,因此后续任务无法识别Z盘。直接使用UNC路径时,也可能因WinRM用户无共享访问权限导致失败。 - UNC路径转义错误:YAML语法中反斜杠需要转义,原任务中的
\\10.14.2.130\shared\folder\Data\未正确转义,会被解析为无效路径。
可行解决方案
方案一:直接使用带权限的转义UNC路径
无需映射驱动器,修复UNC路径的转义问题,并通过win_find的凭据参数提供共享访问权限:
- name: Search files in Data folder with UNC path win_find: paths: '\\\\10.14.2.130\\shared\\folder\\Data\\' username: 'domain\username' # 本地账户使用 '.\username' password: 'passwordhere' register: file1
说明:YAML中需用双重反斜杠转义,或用单引号包裹路径避免自动转义。
方案二:在同一SYSTEM上下文执行所有相关任务
如果必须使用驱动器映射,确保win_find任务与net use任务在同一个SYSTEM账户上下文执行:
- name: Map drive and search files as SYSTEM block: - name: Map network drive Z: win_command: 'net use Z: \\10.14.2.130\shared\ /user:username passwordhere /p:yes' become: yes become_method: runas become_user: SYSTEM - name: Search files on Z: drive win_find: paths: 'Z:\folder\Data\' register: file1 become: yes become_method: runas become_user: SYSTEM
方案三:使用win_share模块实现幂等映射
替代net use命令,用Ansible原生的win_share模块管理共享映射,更符合幂等性要求:
- name: Ensure network share is mapped as SYSTEM win_share: name: Z path: \\10.14.2.130\shared\ state: present username: 'username' password: 'passwordhere' become: yes become_method: runas become_user: SYSTEM - name: Search files on mapped Z: drive win_find: paths: 'Z:\folder\Data\' register: file1 become: yes become_method: runas become_user: SYSTEM
内容的提问来源于stack exchange,提问作者Blitzden
相关产品推荐
相关产品推荐

