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

如何用Ansible将所有主机的输出追加至单个TXT文件而非覆盖?

Ansible实现多主机输出合并至同一文件

问题场景

需要用Ansible完成以下任务:通过ios_command模块在多台IOS设备上执行sh run | i hostname和show vlan brief | i active命令,将输出注册为output变量,打印后写入本地文件/etc/ansible/show01.txt。

当前使用的任务代码:

tasks:
  - ios_command:
     commands:
       - sh run | i hostname
       - show vlan brief | i active
    register: output
  - debug: 
      msg="{{ output.stdout_lines }}"
  - copy:
      content: "{{ output.stdout_lines }}"
      dest: /etc/ansible/show01.txt

实际执行后发现,文件里只保留了最后一台主机s4的输出,s1、s2、s3的内容都被覆盖了,输出示例如下:

[["hostname s4"], 
["1   default                     active    ", 
"10   VLAN0010                    active    ",
"100  VLAN0100                    active    Gi0/0"]]

想要实现类似Python追加模式(with open('output_june.txt', 'a') as file3:)的效果,把所有主机的输出合并到同一文件,而不是每次覆盖。

解决方法

方法1:单主机执行时直接追加内容

利用shell模块执行文件追加命令,每次执行都把当前主机的输出追加到文件末尾:

tasks:
  - ios_command:
     commands:
       - sh run | i hostname
       - show vlan brief | i active
    register: output
  - debug: 
      msg="{{ output.stdout_lines }}"
  # 追加当前主机的输出到目标文件,转成yaml格式更易读
  - shell: 'echo "{{ output.stdout_lines | to_nice_yaml }}" >> /etc/ansible/show01.txt'
    delegate_to: localhost
    become: no  # 若文件无需root权限可省略

方法2:先收集所有主机输出,再一次性写入

这种方式更高效,适合主机数量较多的场景,减少文件IO操作:

tasks:
  - ios_command:
     commands:
       - sh run | i hostname
       - show vlan brief | i active
    register: output
  # 将当前主机的输出保存为专属变量
  - set_fact:
      device_output: "{{ output.stdout_lines }}"
  # 汇总所有主机的输出,仅在本地执行一次写入
  - copy:
      content: "{{ ansible_play_hosts | map('extract', hostvars, 'device_output') | to_nice_yaml }}"
      dest: /etc/ansible/show01.txt
    delegate_to: localhost
    run_once: true  # 确保该任务只执行一次,避免重复写入

说明

  • 方法1简单直接,每台主机执行时都会追加内容,但如果主机数量多,会多次操作文件
  • 方法2先把所有主机的输出收集到变量中,最后一次性写入文件,效率更高,输出格式也更规整
  • to_nice_yaml过滤器可以让输出内容排版更清晰,也可以根据需求换成to_nice_json或者直接输出原始格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:53:21