Ansible fetch模块不符合预期:远程文件复制路径异常问题
嘿,这个问题我熟!你遇到的是Ansible fetch模块的默认行为坑——它会把远程主机的完整路径结构+主机名嵌套到你指定的目标目录里,所以才会出现那种奇怪的多层路径。咱们来把它改成你想要的/tmp/results/<文件名>结构:
修正Ansible远程文件拉取路径的方案
核心问题原因
你大概率用的是Ansible的fetch模块(这是拉取远程文件到控制节点的常用模块),它默认会复刻远程文件的完整路径,还会把远程主机名作为子目录嵌套进去,这就是为什么你看到了/tmp/EM_Prereq_testbafffmqygx_root_Warning_20180311202123.txt/test.host.com/tmp/<实际文件名>这种冗余路径。
修正后的Playbook代码
--- - name: 拉取远程EM_Prereq开头的文件到本地指定目录 hosts: all tasks: # 先在本地创建目标目录(确保存在) - name: 创建本地/tmp/results目录 file: path: /tmp/results state: directory mode: '0755' delegate_to: localhost # 指定在Ansible控制节点执行 run_once: true # 只执行一次,不用在所有远程主机上重复创建 # 拉取远程文件并调整路径 - name: 复制远程/tmp下的EM_Prereq*文件到本地 fetch: src: "/tmp/{{ item }}" dest: "/tmp/results/" flat: yes # 关键参数!禁用路径复刻,直接把文件放到dest目录下 validate_checksum: yes with_fileglob: - "/tmp/EM_Prereq*"
关键参数说明
flat: yes:这是解决路径问题的核心!它告诉Ansible不要创建嵌套的路径结构(远程主机名、原路径层级都不会生成),直接将文件复制到dest指定的目录下。delegate_to: localhost:确保创建目录的操作只在Ansible控制节点执行,而不是远程主机。run_once: true:让创建目录的任务只执行一次,避免在所有远程主机上重复执行。
额外优化建议
如果不同远程主机上存在同名的EM_Prereq*文件,flat: yes会导致本地文件被覆盖。你可以通过在文件名中加入主机名来避免这个问题:
dest: "/tmp/results/{{ inventory_hostname }}_{{ item }}"
这样生成的文件名会变成/tmp/results/test.host.com_EM_Prereq_xxx.txt,既能区分来源主机,又不会覆盖文件。
内容的提问来源于stack exchange,提问作者dbain
相关产品推荐
相关产品推荐

