如何解析字典列表并输出Ansible中的值?

时间:2019-07-03 08:43:13

标签: ansible

我有以下json输出。这是字典的清单。我只想解析它并输出它的值。

我尝试了以下游戏,但没有成功...

"output1": {
    "changed": false, 
    "msg": "All items completed", 
    "results": [
        {
            "item": [
                {
                    "Device_Name": "SW1"
                }, 
                {
                    "Interface": "GigabitEthernet1/0/7"
                }
                    ]
         }
    ]
}
    - name: Display output1...2
      debug:
        msg: "{{ item.1.Device_Name }};{{ item.1.Interface }}"
      with_subelements: 
        - "{{ output1.results }}"
        - item

错误为“” msg“:”该任务包括带有未定义变量的选项。错误为:“字典对象”没有属性“ int_name” \ n \ n”

2 个答案:

答案 0 :(得分:2)

请尝试以下-我尚未测试过。

    - name: Display output1...2
      debug:
        msg: "{{ item|first }} : {{ item[item|first] }}"
      with_items:
        - "{{ output1.results[0].item }}"

答案 1 :(得分:0)

又快又脏

以下任务可以快速给出要求的内容

- set_fact:
    Device_Name: "{{ output1.results[0]['item']|
                     map(attribute='Device_Name')|
                     select('defined')|
                     list|first }}"
    Interface: "{{   output1.results[0]['item']|
                     map(attribute='Interface')|
                     select('defined')|
                     list|first }}"

详细信息

这是不良数据结构的典型示例。下面的任务

- debug:
    msg: "{{ output1.results|
             map('dict2items')|list|flatten|
             json_query('[?key==`item`].value')|flatten }}"

给出 item ,它是一个列表,必须再次进行迭代,

"msg": [
        {
            "Device_Name": "SW1"
        }, 
        {
            "Interface": "GigabitEthernet1/0/7"
        }
]

而不是字典,可以很容易地引用它。

"msg": [
        {
            "Device_Name": "SW1",
            "Interface": "GigabitEthernet1/0/7"
        }
]

由于对以下任务进行了过滤

- set_fact:
    Device_Name: "{{ output1.results|
                     map('dict2items')|list|flatten|
                     json_query('[?key==`item`].value')|flatten|
                     map('dict2items')|list|
                     json_query('[*][?key==`Device_Name`].value')|flatten }}"
- set_fact:
    Interface: "{{ output1.results|
                   map('dict2items')|list|flatten|
                   json_query('[?key==`item`].value')|flatten|
                   map('dict2items')|list|
                   json_query('[*][?key==`Interface`].value')|flatten }}"
- debug:
    var: Device_Name
- debug:
    var: Interface

给予

"Device_Name": [
    "SW1"
]

"Interface": [
    "GigabitEthernet1/0/7"
]