如何将多个Ansible任务输出追加至控制节点同一文件?
解决Ansible任务输出追加到控制节点文件的问题
你的问题核心是copy模块默认会覆盖目标文件内容,所以最终仅保留最后一个任务的输出。下面提供几种可行的解决方法:
方法1:用lineinfile模块实现追加
lineinfile模块支持将内容追加到文件末尾,适合逐行写入任务输出。需要把stdout_lines列表转换成逐行内容:
- name: Playbook to append task outputs to the same file hosts: test tasks: - name: task_1 shell: command_1 register: output_1 - name: append output_1 to output.log lineinfile: path: ./output.log line: "{{ item }}" insertafter: EOF create: yes # 文件不存在时自动创建 loop: "{{ output_1.stdout_lines }}" delegate_to: localhost - name: task_2 shell: command_2 register: output_2 - name: append output_2 to output.log lineinfile: path: ./output.log line: "{{ item }}" insertafter: EOF create: yes loop: "{{ output_2.stdout_lines }}" delegate_to: localhost
方法2:先收集所有输出,最后一次性写入
如果任务数量不多,可以先把所有输出汇总到一个变量,最后统一写入文件,减少文件操作次数:
- name: Playbook to collect outputs then write to file hosts: test vars: all_outputs: [] tasks: - name: task_1 shell: command_1 register: output_1 changed_when: false - name: add task_1 output to collection set_fact: all_outputs: "{{ all_outputs + output_1.stdout_lines }}" delegate_to: localhost - name: task_2 shell: command_2 register: output_2 changed_when: false - name: add task_2 output to collection set_fact: all_outputs: "{{ all_outputs + output_2.stdout_lines }}" delegate_to: localhost - name: write all outputs to file copy: content: "{{ all_outputs | join('\n') }}" dest: ./output.log delegate_to: localhost
方法3:用shell命令直接追加到控制节点文件
通过delegate_to: localhost执行shell的追加命令,直接把输出写入文件:
- name: Playbook to append outputs via shell hosts: test tasks: - name: task_1 shell: command_1 register: output_1 - name: append output_1 to output.log shell: "echo '{{ output_1.stdout | escape }}' >> ./output.log" delegate_to: localhost - name: task_2 shell: command_2 register: output_2 - name: append output_2 to output.log shell: "echo '{{ output_2.stdout | escape }}' >> ./output.log" delegate_to: localhost
注意:如果输出包含单引号等特殊字符,需用escape过滤器处理,避免shell命令执行报错。
内容的提问来源于stack exchange,提问作者Aditya Siddarth
相关产品推荐
相关产品推荐

