我一直在阅读和搜索很多内容,无法克服这个问题。你能帮忙吗?
在下面的内容中,我需要提取属性“ ipAddress”并推送到列表。实际数据是诸如“ host01”之类的对象的字典,但例如,我将数据缩减为一个主机。
{
"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] *********************************************** *************************************************** 好的:[localhost] =>(item = {'value':{u'interface':{u'Bundle-Ether1001':{u'subnetMask':u'255.255.255.252',u'ipAddress':u'10.20 .30.41'},u'Bundle-Ether1002':{u'subnetMask':u'255.255.255.252',u'ipAddress':u'10.20.30.45'}},u'timestamp':1545420334,u'fqdn' :u'host01.mydomain'},'key':u'host01'})=> { “消息”:[] }
我做错了什么?
答案 0 :(得分:0)
selectattr
过滤器是不正确的,因为ipAddress
埋在结构中,而不是在您的任何的顶层。特定的设置。人们可以很容易地在任务输出中看到item
的形状,因此我不知道您为什么会采用任何其他形状,但是就在这里。您对map
的调用也是不正确的,因为没有value.ipAddress
这样的过滤器,只有您的selectattr
是正确的,该过滤器才会爆炸。
- debug:
msg: '{{ item.value.interface | dict2items | map(attribute="value.ipAddress") | select("defined") }}'
with_dict: '{{ myjson }}'
如果您希望将所有ipAddress
值埋入host.interface
结构中,则实际上需要在{{1 }}字典,with_dict
就是这样做的。然后,您可以继续进行以下操作并提取host.interface
,以免出现一些不确定的情况,然后将未定义的内容扔掉。
答案 1 :(得分:0)
一个选择是使用json_query
- debug:
msg: "{{ item.value.interface | dict2items | json_query('[].value.ipAddress') }}"