Loops Ansible selectattr+;地图+;列表返回空结果
我已经阅读和搜索了很多,无法克服这个问题。你能帮忙吗 有了下面的内容,我需要提取属性“ipAddress”并推送到一个列表。实际数据是对象的dict,如“host01”,但在本例中,我将数据缩减为一个主机Loops Ansible selectattr+;地图+;列表返回空结果,loops,dictionary,filter,ansible,Loops,Dictionary,Filter,Ansible,我已经阅读和搜索了很多,无法克服这个问题。你能帮忙吗 有了下面的内容,我需要提取属性“ipAddress”并推送到一个列表。实际数据是对象的dict,如“host01”,但在本例中,我将数据缩减为一个主机 { "host01": { "fqdn": "host01.mydomain", "interface": { "Bundle-Ether1001": {
{
"host01": {
"fqdn": "host01.mydomain",
"interface": {
"Bundle-Ether1001": {
"ipAddress": "10.20.30.41",
"subnetMask": "255.255.255.252"
},
"Bundle-Ether1002": {
"ipAddress": "10.20.30.45",
"subnetMask": "255.255.255.252"
}
},
"timestamp": 1545420334
}
}
我的剧本如下:
---
- name : myplaybook
hosts: localhost
vars:
myjson: "{{ lookup('file', 'api.json') | from_json }}"
tasks:
- name: debug
debug:
msg: "{{myjson}}"
- name: debugallip
when: item.value.interface is defined
debug:
msg: "{{ item | selectattr('ipAddress', 'defined') | map('value.ipAddress') | list }}"
with_dict: "{{ myjson }}"
哪个返回空列表?:(
任务[debugallip]******************************************************************************************
ok:[localhost]=>(item={'value':{u'interface':{u'Bundle-Ether1001':{u'subnetMask:u'255.255.252',u'ipAddress:u'10.20.30.41'},u'Bundle-Ether1002':{u'subnetMask':u'255.255.252',u'ipAddress:u'10.20.30.45'},u'timestamp:1545420334,u'fqdn:u'host01.mydomain'',u'key=>{
“msg”:[]
}
我做错了什么?由于
ipAddress
隐藏在结构中,而不是在您特定设置中的顶层,因此selectattr
过滤器不正确。您可以很容易地在任务输出中看到项的形状,因此我不知道您为什么会采用任何其他形状,但是我们到了。您对map
的调用也不正确,因为没有像value.ipAddress
这样的筛选器,只有在selectattr
正确的情况下,它才会实际爆炸
- debug:
msg: '{{ item.value.interface | dict2items | map(attribute="value.ipAddress") | select("defined") }}'
with_dict: '{{ myjson }}'
如果您想将所有ipAddress
值隐藏在host.interface
结构中,则需要在host.interface
dict上使用_dict
循环执行另一个,这就是dict2items
的功能。然后,您可以通过继续并提取.ipAddress来保存一些副本
,风险是它没有定义,然后在结尾处扔掉未定义的一个选项是使用json\u查询
- debug:
msg: "{{ item.value.interface | dict2items | json_query('[].value.ipAddress') }}"
谢谢你的评论,我想我不会接受json对象列表实际上是一个数组。你是否认为我的数据结构格式不好?如果是这样,我很想学习,如果你有建议,我愿意接受。最后,感谢你的解释和给我一个工作示例。我将从中构建。事实上,我会我们对如何在循环中循环(嵌套循环?)我试过了,哦,我试过了…我只是看不到。我有没有提到我使用Ansible不到一个月了?嗨,弗拉基米尔,我也试过了,我觉得它很难看,但至少对我有效。我的解决方案会产生一个列表列表,再加上一些额外的步骤,我最终可以得到一些可以使用的东西。下面是我的列表:{{mylist+[item | json_query('value.interface.*.ipAddress')]}和{{myjson}检查您的解决方案和Matthew的解决方案后,我很清楚我必须将接口列表视为一个数组…mylist:{mylist+[item | json_query('value.interface.*.ipAddress')]}和{{{myjson}和{myjson}和{code>