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

Ansible如何将同一文件复制到多个不同路径?

解决方案

你的核心问题是对Ansible find模块的返回结构理解有误,且错误地尝试用无效的字典构造逻辑处理路径。以下是两种符合需求的实现方式,根据你的实际场景选择:

场景1:替换目标节点上已存在的对应隐藏文件

如果需要替换每个Web应用目录下已有的同名隐藏文件,可直接定位这些文件路径并批量复制:

- name: Replace hidden files across webapps
  hosts: webservers
  tasks:
    - name: 定位所有Web应用下的目标隐藏文件
      ansible.builtin.find:
        paths: /home/user/webapps
        patterns: 'file'  # 匹配目标文件名,若为标准隐藏文件需改为 '.file'
        file_type: file
        hidden: true
        recurse: no  # 若文件在Web应用子目录下,改为 yes
      register: target_files

    - name: 将控制节点的源文件复制到每个目标路径
      ansible.builtin.copy:
        src: /home/user/file  # 控制节点上的源文件路径
        dest: "{{ item.path }}"
        owner: user
        group: user
        mode: '0644'
      loop: "{{ target_files.files }}"

场景2:为每个Web应用目录部署新文件(不管原文件是否存在)

如果需要给所有Web应用目录都部署该文件,无需提前查找文件,先获取Web应用目录列表再构造目标路径:

- name: Deploy hidden file to all webapps
  hosts: webservers
  tasks:
    - name: 获取所有Web应用目录列表
      ansible.builtin.find:
        paths: /home/user/webapps
        file_type: directory
        recurse: no
      register: webapp_dirs

    - name: 复制源文件到每个Web应用目录
      ansible.builtin.copy:
        src: /home/user/file
        dest: "{{ item.path }}/file"  # 构造目标路径
        owner: user
        group: user
        mode: '0644'
        force: yes  # 若目标路径已存在文件,强制覆盖
      loop: "{{ webapp_dirs.files }}"

原Playbook的问题说明

  1. set_fact中的path变量未定义,导致字典构造失败
  2. file_paths.results|map(attribute='files')|list返回的是嵌套列表(每个元素对应一个初始遍历目录下的文件列表),无法直接用于构造有效字典
  3. 无需额外构造字典,find模块返回的files字段本身就是可直接遍历的文件/目录信息列表

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 01:05:24