因此,我正在使用 Ansible 对我们支持的许多服务器进行一些审核点。在大多数情况下,我必须使用 shell 模块来获取我想要的数据,然后根据通过/失败情况编写一些文件。在很多情况下,这是处理输出数据的更简单的方法。首先,我意识到这不一定是 Ansible 的强项。我想在某个时候,有人向公司推销说它可以很容易地做到这一点,我同意——它在很多方面都比仅仅编写一个自定义的 python/BASH 脚本来完成同样的事情更容易。所以 - 我确实意识到我在这里稍微弯曲了 Ansible 的概念来进行报告,而不是配置/状态管理。然而; 我喜欢这个工具,并想向公司展示我们可以从中获得很多价值。
虽然我可以使用 shell 模块轻松完成本节,但我想更好地学习 Ansible。所以我想我会发布这个问题。
我正在使用 Yum 模块在目标主机上获取 repolist。但我一直对如何提取输出字典中嵌套的列表值感到困惑。我已经对类型进行了一些检查,据我所知 - “结果”变量是一个字典,输出在列表中。我想做的是从列表中获取键/值,然后根据该输出执行一些其他任务。但对于我的生活 - 我不知道该怎么做!
理想情况下 - 我想使用一些基于输出的“when”模块语句(例如,当存储库 ID 是.. 执行此操作.. 时),或者至少能够将它们存储在变量中以处理数据。因此,从这个输出中,我只想获取 reoid 以及它是否已启用。如何从嵌套列表中获取这些值?
简单的剧本:
---
- hosts: localhost
become: yes
tasks:
- name: Section 1.1 - Check Yum Repos
yum:
list: repos
register: section1_1
- name: Debug
debug:
var: section1_1
Run Code Online (Sandbox Code Playgroud)
这是本剧本中调试任务的输出:
TASK [Debug] ****************************************************************************************************************************************************
ok: [localhost] => {
"section1_1": {
"changed": false,
"failed": false,
"results": [
{
"repoid": "ansible",
"state": "enabled"
},
{
"repoid": "epel",
"state": "enabled"
},
{
"repoid": "ol7_UEKR6",
"state": "enabled"
},
{
"repoid": "ol7_latest",
"state": "enabled"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
我怀疑这对于外面的人来说可能很容易。我已经尝试了很长一段时间了,终于达到了我想我只想问的地步:)
由于注册的输出section1_1是字典列表。我们可以循环遍历每个项目,以获得字典键。
例子:
- name: Get the first repo's repoid and state
debug:
msg: "Repo ID: {{ results[0]['repoid'] }}, is {{ results[0]['state'] }}"
# This will show -- Repo ID: ansible, is enabled
Run Code Online (Sandbox Code Playgroud)
同样,我们可以通过编号访问其他元素。
或者我们可以循环遍历数组的每个元素:
- name: loop through array and conditionally do something
debug:
msg: "Repo ID is {{ item.repoid }}, so I am going to write a playbook."
when: item.repoid == 'ansible'
loop: "{{ results }}"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8492 次 |
| 最近记录: |