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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:52:45