因此,我正在使用Ansible对我们支持的许多服务器进行一些审核。在大多数情况下,我不得不使用shell模块来获取所需的数据,然后根据通过/失败情况写入一些文件。在许多情况下,这是处理输出数据的更简单方法。首先,我意识到这不一定是Ansible的长处。我想在某个时候它已经向公司推荐可以很容易地做到这一点,并且我同意-在很多方面,它比编写自定义python / BASH脚本要容易得多。所以-我确实意识到我在这里将Ansible的概念用于报告而不是配置/状态管理。然而;我喜欢该工具,并希望向公司展示我们可以从中获得很多价值。
尽管我可以使用shell模块轻松完成本节,但我想更好地学习Ansible。所以以为我会发布这个问题。
我正在使用Yum模块在目标主机上进行重新抛光。但是我一直对如何提取嵌套在输出字典中的列表值感到困惑。我已经对类型进行了一些检查,据我所知-'results'变量是一个字典,输出在列表中。我要做的是从列表中获取键/值,然后根据该输出执行其他一些任务。但是为了我的一生-我不知道该怎么做!
理想情况下-我想基于输出使用某些“何时”模块语句(例如,当回购ID是...执行此操作时)或至少能够将它们存储在变量中以供使用数据。因此,从此输出中,我只想获取Repoid,如果已启用。如何从嵌套列表中获取这些值?
简单剧本:
---
- hosts: localhost
become: yes
tasks:
- name: Section 1.1 - Check Yum Repos
yum:
list: repos
register: section1_1
- name: Debug
debug:
var: section1_1
这是此剧本中调试任务的输出:
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"
}
]
}
}
我怀疑这对外面的人来说可能很容易。我一直在尝试,这已经有一段时间了,终于到了我以为我会问的地方:)
答案 0 :(得分:2)
在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
类似地,我们可以访问其他元素及其编号。
或者我们可以遍历数组的每个元素:
- 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 }}"
答案 1 :(得分:1)
Q:“ 从列表中获取键/值。”
A:还有更多选择。鉴于下面的简化数据
section1_1:
changed: false,
failed: false,
results:
- {repoid: ansible, state: enabled}
- {repoid: epel, state: enabled}
- {repoid: test9, state: disabled}
- set_fact:
keys_all: "{{ section1_1.results|
map(attribute='repoid')|
list }}"
- debug:
var: keys_all
给予
keys_all:
- ansible
- epel
- test9
- set_fact:
keys_ena: "{{ section1_1.results|
selectattr('state', 'eq', 'enabled')|
map(attribute='repoid')|
list }}"
- debug:
var: keys_ena
给予
keys_ena:
- ansible
- epel
使用 items2dict 创建字典。例如
- set_fact:
dict: "{{ section1_1.results|
items2dict(key_name='repoid', value_name='state') }}"
- debug:
var: dict
给予
dict:
ansible: enabled
epel: enabled
test9: disabled