在 Ansible 的列表中检索嵌套值

Retrieve nested value on a list in Ansible

我正在从 VMware 数据存储集合中生成卷列表及其相关标签

我将它们格式化为 JSON 类型的输出,以便以后能够提供给另一个系统。输出有效,但对于标签部分,我只想保留名称和 category_name 而不是其他属性。

这是我的剧本:

  ---
- name: Fetching Datastores
  hosts: localhost
  tasks: 
  - name: Gather info from datacenter about specific datastore
    community.vmware.vmware_datastore_info:
     hostname: 'myesxiHost'
     username: 'administrator'
     password: 'Password'
     validate_certs: False
     show_tag: true
    delegate_to: localhost
    register: ds_info

  - set_fact:
      ds_info_eph: "{{ ds_info_eph|default([]) + [ {
          'name': item.name,
          'type': item.type,
          'capacity': item.capacity,
          'tag': item.tags
          } ] }}"
    loop: "{{ ds_info.datastores }}"

  - name: Output info
    debug:
      msg: "{{ ds_info_eph }}"

这个剧本给我以下输出:

ok: [localhost] => {
    "msg": [
        
        {
            "capacity": 499826819072,
            "name": "ESX01_SSD4",
            "tag": [
                {
                    "category_id": "urn:vmomi:InventoryServiceCategory:017ad796-b931-4f5b-bd4a-8fee7adaf124:GLOBAL",
                    "category_name": "Tier",
                    "description": "",
                    "id": "urn:vmomi:InventoryServiceTag:6112eeac-ed81-48d4-b7d9-81084b8a415a:GLOBAL",
                    "name": "Gold"
                }
            ],
            "type": "VMFS"
        },
        {
            "capacity": 499826819072,
            "name": "ESX01_SSD3",
            "tag": [
                {
                    "category_id": "urn:vmomi:InventoryServiceCategory:017ad796-b931-4f5b-bd4a-8fee7adaf124:GLOBAL",
                    "category_name": "Tier",
                    "description": "",
                    "id": "urn:vmomi:InventoryServiceTag:6112eeac-ed81-48d4-b7d9-81084b8a415a:GLOBAL",
                    "name": "Gold"
                }
            ],
            "type": "VMFS"
        },
        {
            "capacity": 499826819072,
            "name": "ESX01_SSD5",
            "tag": [
                {
                    "category_id": "urn:vmomi:InventoryServiceCategory:017ad796-b931-4f5b-bd4a-8fee7adaf124:GLOBAL",
                    "category_name": "Tier",
                    "description": "",
                    "id": "urn:vmomi:InventoryServiceTag:6112eeac-ed81-48d4-b7d9-81084b8a415a:GLOBAL",
                    "name": "Gold"
                }
            ],
            "type": "VMFS"
        },
        {
            "capacity": 239981297664,
            "name": "ESX01_SSD2",
            "tag": [
                {
                    "category_id": "urn:vmomi:InventoryServiceCategory:017ad796-b931-4f5b-bd4a-8fee7adaf124:GLOBAL",
                    "category_name": "Tier",
                    "description": "",
                    "id": "urn:vmomi:InventoryServiceTag:6112eeac-ed81-48d4-b7d9-81084b8a415a:GLOBAL",
                    "name": "Gold"
                }
            ],
            "type": "VMFS"
        },
        {
            "capacity": 248034361344,
            "name": "ESX01_SSD1",
            "tag": [
                {
                    "category_id": "urn:vmomi:InventoryServiceCategory:017ad796-b931-4f5b-bd4a-8fee7adaf124:GLOBAL",
                    "category_name": "Tier",
                    "description": "",
                    "id": "urn:vmomi:InventoryServiceTag:6112eeac-ed81-48d4-b7d9-81084b8a415a:GLOBAL",
                    "name": "Gold"
                }
            ],
            "type": "VMFS"
        }
    ]
}

相反,我想要这样的输出:

ok: [localhost] => {
    "msg": [

        {
            "capacity": 499826819072,
            "name": "ESX01_SSD4",
            "tag": [
                {
                    "category_name": "Tier",
                    "name": "Gold"
                }
            ],
            "type": "VMFS"
        },
        {
            "capacity": 499826819072,
            "name": "ESX01_SSD3",
            "tag": [
                {
                    "category_name": "Tier",
                    "name": "Gold"
                }
            ],
            "type": "VMFS"
        },
        {
            "capacity": 499826819072,
            "name": "ESX01_SSD5",
            "tag": [
                {
                    "category_name": "Tier",
                    "name": "Gold"
                }
            ],
            "type": "VMFS"
        },
        {
            "capacity": 239981297664,
            "name": "ESX01_SSD2",
            "tag": [
                {
                    "category_name": "Tier",
                    "name": "Gold"
                }
            ],
            "type": "VMFS"
        },
        {
            "capacity": 248034361344,
            "name": "ESX01_SSD1",
            "tag": [
                {
                    "category_name": "Tier",
                    "name": "Gold"
                }
            ],
            "type": "VMFS"
        }
    ]
}

但是在标签部分,我尝试在剧本中执行以下操作以仅获取名称而不是所有标签项列表:'tag': item.tags.name 但是我遇到了以下致命错误:[localhost]: FAILED! => {"msg": "Unexpected templating type error occurred on ({{ ds_info_eph|default([]) + [ { 'name': item.name, 'type': item.type, 'capacity': item.capacity, 'tag': item.tags.name } ] }}): can only concatenate str (not \"list\") to str"}

我的理解是 set_fac 我不得不再次循环以仅获取标签名称和标签 category_name 但我不知道该怎么做。

感谢您的帮助!

Select 标签列表中的属性,例如

    - set_fact:
        _tags: "{{ ds_info_eph|
                   map(attribute='tag')|
                   map('items2dict', 'category_name', 'name')}}"

给予

  _tags:
  - Tier: Gold
  - Tier: Gold
  - Tier: Gold
  - Tier: Gold
  - Tier: Gold

合并词典

    - set_fact:
        result: "{{ result|d([]) + [item.0|combine({'tag': item.1})] }}"
      with_together:
        - "{{ ds_info_eph }}"
        - "{{ _tags|map('dict2items', 'category_name', 'name') }}"

给予

  result:
  - capacity: 499826819072
    name: ESX01_SSD4
    tag:
      category_name: Tier
      name: Gold
    type: VMFS
  - capacity: 499826819072
    name: ESX01_SSD3
    tag:
      category_name: Tier
      name: Gold
    type: VMFS
  - capacity: 499826819072
    name: ESX01_SSD5
    tag:
      category_name: Tier
      name: Gold
    type: VMFS
  - capacity: 239981297664
    name: ESX01_SSD2
    tag:
      category_name: Tier
      name: Gold
    type: VMFS
  - capacity: 248034361344
    name: ESX01_SSD1
    tag:
      category_name: Tier
      name: Gold
    type: VMFS