嵌套字典列表中的 ansible 访问键

时间:2021-03-24 23:37:09

标签: ansible

我正在尝试使用循环来检索多个列表嵌套字典中存在的多个值。不幸的是,除非我明确定义要抓取的列表,否则我似乎无法这样做。由于我打算定义数百个这样的设备,我希望有一些可以更好地扩展的东西。

#playbook.yml
tasks:
   - name: Get volume details using name
      get_storage_volume:
        host: "{{ host }}"
        username: "{{ username }}"
        password: "{{ password }}"
        name: "{{ inventory_hostname }}-{{ item.volsuffix }}"
        state: "present"
      register: volume_results
      loop: "{{ volumes }}"
volumes:
  - volsuffix: data1
    volsize: 100
    mount_path: /data/fs1
    fstype: xfs
    mount_opts: noatime
    storage_protocol: fc

  - volsuffix: data2
    volsize: 100
    mount_path: /data/fs2
    fstype: xfs
    mount_opts: noatime,_netdev
    storage_protocol: iscsi

    - debug:
        msg: "{{ volume_results.results.0.attrs.serial_number }}"
        #msg: "{{ volume_results.results.1.attrs.serial_number }}"

我想避免显式调用列表条目 [0] 和 [1],如下所示:

TASK [debug] *********************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [node1] => {
    "msg": "abcdef12345"
}
ok: [node2] => {
    "msg": "cvbnm46807"
}

如果我输出所有“{{ volume_results.result }}”,数据格式如下所示:

TASK [debug] *******************************************************************
ok: [node1] => {
    "volume_results.results": [
        {
            "ansible_loop_var": "item",
            "attrs": {
                "agent_type": "none",
                "name": "node1-data1",
                "serial_number": "abcdef12345",
                "warn_level": 0
            },
        },
        {
            "ansible_loop_var": "item",
            "attrs": {
                "agent_type": "none",
                "name": "node1-data2",
                "serial_number": "987654qwert",
                "warn_level": 0
            }
        }
    ]
}

ok: [node2] => {
    "volume_results.results": [
        {
            "ansible_loop_var": "item",
            "attrs": {
                "agent_type": "none",
                "name": "node2-data1",
                "serial_number": "cvbnm46807",
                "warn_level": 0
            },
        },
        {
            "ansible_loop_var": "item",
            "attrs": {
                "agent_type": "none",
                "name": "node2-data2",
                "serial_number": "asdfg56789",
                "warn_level": 0
            }
        }
    ]
}

想法?

1 个答案:

答案 0 :(得分:1)

要么使用map,例如

- debug:
    msg: "{{ volume_results.results|
             map(attribute='attrs.serial_number')|list }}"

,或 json_query,例如

- debug:
    msg: "{{ volume_results.results|
             json_query('[].attrs.serial_number') }}"