问题描述
在使用Ansible时遇到了一个问题,他需要从Ansible在清单中的每个主机上运行的Shell命令的输出中提取特定信息并显示在屏幕上。他已经使用Ansible的register模块将命令的完整输出注册为变量,但他在尝试显示特定信息时遇到了困难。他尝试了不同的方法,包括使用json_query过滤器,但没有取得预期的结果。他需要了解如何正确地解析这个输出。
解决方案
在解决这个问题之前,让我们首先了解一下注册变量和数据结构。通过Ansible的register模块,您可以将命令的输出结果保存在一个变量中,这个变量是一个字典对象。在您的问题中,变量名为smm_output
。
迭代或过滤结果
要访问嵌套在字典中的信息,您需要使用适当的语法。在这种情况下,您想要访问smm_output
字典中的results
字段,该字段是一个列表。要么您可以迭代这个列表,要么您可以通过索引来访问特定元素。这里有两种方法:
迭代方式
如果您期望在每个主机上运行命令,并且在每个主机上只有一个结果,请使用迭代的方法。这个方法适用于多个主机的情况,每个主机都有一个命令的结果。以下是如何实现的步骤:
- 创建一个Ansible Playbook。
- 在Playbook中定义一个任务,使用
shell
模块运行命令,并将输出注册为变量。 - 在同一个任务中,使用
debug
模块迭代smm_output.results
列表,并显示所需信息。
以下是一个示例Playbook:
---
- name: Extract and Display SMM Version
hosts: your_inventory_group
tasks:
- name: Run shell command
shell: your_command_here
register: smm_output
- name: Display SMM Version
debug:
msg: "{{ item.stdout_lines }}"
loop: "{{ smm_output.results }}"
通过索引访问方式
如果您知道结果列表只包含一个元素,您可以直接通过索引访问所需的信息。以下是如何实现的步骤:
- 创建一个Ansible Playbook。
- 在Playbook中定义一个任务,使用
shell
模块运行命令,并将输出注册为变量。 - 在同一个任务中,使用
debug
模块显示smm_output.results.0.stdout_lines
。
以下是一个示例Playbook:
---
- name: Display SMM Version
hosts: your_inventory_group
tasks:
- name: Run shell command
shell: your_command_here
register: smm_output
- name: Display SMM Version
debug:
msg: "{{ smm_output.results.0.stdout_lines }}"
总结
您可以根据您的需要选择使用迭代方法或通过索引访问方法来获取并显示特定信息。通过合理地使用Ansible的数据结构和过滤器,您可以轻松地从注册的变量中提取所需的信息并进行展示。
请注意,Ansible的版本和用法可能会影响上述解决方案的实际效果。在使用这些解决方案之前,请确保您了解Ansible的相关文档和用法,并根据您的实际情况进行调整。
引用:Stack Overflow回答提供了与此类似问题的解决方案,虽然不是直接的答案,但可能对解决问题有帮助。