问题描述
在使用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_callback
为json
。
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
- 运行您的Playbook。
此任务将在第一个主机上运行一次,并收集所有主机的result
变量的stdout_lines
。然后,它将把这些输出组合到一个列表中,您可以将其进一步处理为JSON格式。
注意:在执行任何操作之前,请确保您已经了解并备份了重要数据,以防意外情况。
方案3: 使用Logstash进行日志聚合
如果您希望更专业地处理和管理日志,您可以考虑使用Logstash等日志聚合技术。这将帮助您将不同设备的日志集中存储,并为您提供更多分析和查询的能力。
无论您选择哪种方案,都可以根据您的需求和喜好来进行选择。