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的问题说明
set_fact中的path变量未定义,导致字典构造失败file_paths.results|map(attribute='files')|list返回的是嵌套列表(每个元素对应一个初始遍历目录下的文件列表),无法直接用于构造有效字典- 无需额外构造字典,
find模块返回的files字段本身就是可直接遍历的文件/目录信息列表
内容的提问来源于stack exchange,提问作者Cmurg
相关产品推荐
相关产品推荐

