Ansible selectattr + map + list返回空结果

时间:2019-01-23 19:56:29

标签: loops dictionary filter ansible

我一直在阅读和搜索很多内容,无法克服这个问题。你能帮忙吗?

在下面的内容中,我需要提取属性“ 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'})=> {     “消息”:[] }

我做错了什么?

2 个答案:

答案 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') }}"