如何使用Ansible fetch模块从多节点收集信息并追加至TXT文件而非覆盖?
这个问题我之前在维护Ansible批量任务时也碰到过——fetch模块的flat: yes确实是直接覆盖目标文件,没办法直接实现追加逻辑。不过有两种实用的办法可以满足你的需求,我分别给你拆解一下:
方法1:先按主机独立存储,再合并内容
这是最稳妥的方式,利用Ansiblefetch默认的目录结构先保存每个节点的文件,再用assemble模块合并成一个文件:
首先修改你的fetch任务,去掉flat: yes,让Ansible自动为每个主机创建子目录存储文件:
- name: 从各节点抓取目标文件 fetch: src: /path/to/file.txt dest: /ansible/temp_collect/ flat: no
执行后,每个节点的文件会被存在/ansible/temp_collect/{{ inventory_hostname }}/path/to/file.txt路径下,完全不会互相覆盖。
接着用assemble模块把所有主机的文件内容合并到最终的TXT文件里,还可以自定义分隔符:
- name: 将所有节点的内容合并到同一个文件 assemble: src: /ansible/temp_collect/ dest: /ansible/path/to/final_result.txt regexp: 'file.txt$' # 只匹配我们要的文件 delimiter: "\n---\n" # 可选,用分隔线区分不同节点的内容,方便阅读
assemble会自动遍历所有子目录里的目标文件,把内容依次追加到最终文件中。如果需要重新收集,只需先删除temp_collect目录或者最终文件即可。
方法2:抓取到临时文件后,本地追加到目标文件
如果你不想保留每个主机的独立文件,可以直接抓取到临时文件,再通过shell命令追加到最终文件:
- name: 抓取文件到临时路径 fetch: src: /path/to/file.txt dest: /ansible/temp/{{ inventory_hostname }}_temp.txt flat: yes - name: 将临时文件内容追加到最终文件 shell: cat /ansible/temp/{{ inventory_hostname }}_temp.txt >> /ansible/path/to/final_result.txt delegate_to: localhost # 确保在控制节点执行追加操作 run_once: false # 每个节点都执行一次追加 - name: 清理临时文件(可选) file: path: /ansible/temp/{{ inventory_hostname }}_temp.txt state: absent delegate_to: localhost
这个方法更直接,但要注意控制节点的临时目录权限,以及如果重复执行会导致内容重复追加的问题,适合一次性收集的场景。
补充说明
为什么fetch的flat: yes会覆盖?因为这个参数的设计逻辑就是直接把源文件复制到指定的dest路径,相当于执行了cp命令而非cat >>,所以本身不支持追加。必须通过后续的合并或追加步骤来实现需求。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

