在Ansible中记录多台主机的输出结果

122次阅读
没有评论

问题描述

在使用Ansible时遇到了一个问题:他有一个Playbook,可以在多个设备上运行EOS命令。目前,他使用bash脚本完成操作,并创建一个大型的文本文件日志。然后,工程师每天将当天的日志与前一天的日志进行比较,以查找异常。他希望有一个简单的Playbook,可以运行命令并将输出记录为JSON格式,以便更容易自动化比较。然而,他发现只有来自一个设备的日志被保存,而他希望在同一个文件中记录来自多个设备的日志。

以下是他的Playbook示例:

---
- name: Checks
  hosts: myhosts
  connection: local
  tasks:
    - name: Run Commands
      eos_command:
        commands:
          - show ip pim neighbor | json
          - show ip bgp summary | json
      register: result
    - name: Save to file
      copy:
        content: "{{ result.stdout_lines | to_nice_json }}"
        dest: "/home/homedirectory/results.json"

解决方案

请注意以下操作可能涉及版本差异,建议在操作前备份。

方案1: 使用Ansible的json stdout回调

您可以使用Ansible的json stdout回调来将所有主机的输出转换为JSON,并使用您喜欢的工具进行解析。每个设备的eos_command输出将在结果JSON中的不同主机键下。
以下是步骤:
1. 在Ansible配置中设置stdout_callbackjson
2. 运行您的Playbook。

这将使Ansible生成一个包含所有主机输出的JSON文件,您可以在后续自动化过程中进行处理。

方案2: 使用run_once任务收集数据

您还可以使用run_once任务来从其他主机收集数据,并将所有设备的输出组合到一个JSON文件中。以下是示例步骤:
1. 添加一个新任务到您的Playbook,如下所示:

- name: Collect Results from Other Hosts
  debug:
    msg: "{{ ansible_play_hosts | map('extract', hostvars, 'result') | map(attribute='stdout_lines') | list }}"
  run_once: yes
  1. 运行您的Playbook。

此任务将在第一个主机上运行一次,并收集所有主机的result变量的stdout_lines。然后,它将把这些输出组合到一个列表中,您可以将其进一步处理为JSON格式。

注意:在执行任何操作之前,请确保您已经了解并备份了重要数据,以防意外情况。

方案3: 使用Logstash进行日志聚合

如果您希望更专业地处理和管理日志,您可以考虑使用Logstash等日志聚合技术。这将帮助您将不同设备的日志集中存储,并为您提供更多分析和查询的能力。

无论您选择哪种方案,都可以根据您的需求和喜好来进行选择。

正文完