Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops Ansible selectattr+;地图+;列表返回空结果_Loops_Dictionary_Filter_Ansible - Fatal编程技术网

Loops Ansible selectattr+;地图+;列表返回空结果

Loops Ansible selectattr+;地图+;列表返回空结果,loops,dictionary,filter,ansible,Loops,Dictionary,Filter,Ansible,我已经阅读和搜索了很多,无法克服这个问题。你能帮忙吗 有了下面的内容,我需要提取属性“ipAddress”并推送到一个列表。实际数据是对象的dict,如“host01”,但在本例中,我将数据缩减为一个主机 { "host01": { "fqdn": "host01.mydomain", "interface": { "Bundle-Ether1001": {

我已经阅读和搜索了很多,无法克服这个问题。你能帮忙吗

有了下面的内容,我需要提取属性“ipAddress”并推送到一个列表。实际数据是对象的dict,如“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]****************************************************************************************** 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>