首页 > 解决方案 > Ansible 从另一个列表中检索键的值

问题描述

我有下面的唯一键列表的 json。

{
    "image_names": [
        {
            "name": "sles-11-factory-os-ready"
        },
        {
            "name": "sles-11-factory-base-vg00"
        },
        {
            "name": "sles-11-factory-base"
        },
        {
            "name": "rhel-7-factory-os-ready"
        },
        {
            "name": "sles-12-factory-os-ready"
        },
        {
            "name": "rhel-6-factory-os-ready"
        },
        {
            "name": "rhel-7-factory-base-vg00"
        },
        {
            "name": "sles-12-factory-base-vg00"
        },
        {
            "name": "rhel-6-factory-base-vg00"
        },
        {
            "name": "rhel-7-factory-base"
        },
        {
            "name": "rhel-6-factory-base"
        },
        {
            "name": "sles-12-factory-base"
        }
    ]
}

我有另一个具有上述键但具有不同值的 json。

{
  "rhel-7-factory-os-ready" : [
      {
          "id": "79334504-3e48-4411-b602-afe920e32e14",
          "updated": "2019-05-07T15:51:00Z"
      },
      {
          "id": "79334504-3e48-4411-b602-afe920e32e14",
          "updated": "2019-05-07T15:51:00Z"
      },
      {
          "id": "79334504-3e48-4411-b602-afe920e32e14",
          "updated": "2019-05-07T15:51:00Z"
      }
   ],
   "rhel-6-factory-os-ready" : [
      {
          "id": "79334504-3e48-4411-b602-afe920e32e14",
          "updated": "2019-05-07T15:51:00Z"
      },
      {
          "id": "79334504-3e48-4411-b602-afe920e32e14",
          "updated": "2019-05-07T15:51:00Z"
      },
      {
          "id": "79334504-3e48-4411-b602-afe920e32e14",
          "updated": "2019-05-07T15:51:00Z"
      }
   ]
}

我试图通过迭代每个图像来通过更新的日期时间值检索最旧的图像。updated最终,当按图像字段排序时,我期待下面的旧图像数据rhel-6-factory-base

skipping: [localhost] => (item={'updated': u'2019-05-07T15:20:39Z', 'name': u'rhel-6-factory-base', 'id': u'30109a53-4aab-4fb5-87ff-7650e75731b0'})
ok: [localhost] => (item={'updated': u'2019-05-07T12:21:36Z', 'name': u'rhel-6-factory-base', 'id': u'294821b3-e9df-4b12-ae39-8deb8f9c72ff'}) => {
    "msg": "The images to be deleted are: 294821b3-e9df-4b12-ae39-8deb8f9c72ff"
}
ok: [localhost] => (item={'updated': u'2019-04-29T14:04:20Z', 'name': u'rhel-6-factory-base', 'id': u'068ae5f0-d7a0-4419-829e-18eb25551c94'}) => {
    "msg": "The images to be deleted are: 068ae5f0-d7a0-4419-829e-18eb25551c94"
}

我试过下面的ansible但没有运气!

- name: Print the old images
    debug:
      msg: "The images to be deleted are: {{ item.id }}"
    when:
      - item|length > 1
      - index != 0
      - item.id is defined
#    loop: "{{ grouped_by_name['rhel-6-factory-base'] }}"
    with_subelements:
      - "{{ image_names | map(attribute='name') | list }}"
      - grouped_by_name
    loop_control:
      index_var: index

在上面的代码片段中,image_names& grouped_by_namevars 分别是前两个数据集。

我怎么能从vargrouped_by_name传递的键中进行双循环?image_names

如果问题不清楚,请随时发表评论,我会尝试改写它。

标签: loopsansiblenested-loops

解决方案


如果我正确理解了您的问题,那么您实际上根本不需要嵌套循环。您的目标是为字典中的每个键找到最旧的图像。我们可以这样做:

- hosts: localhost
  gather_facts: false
  vars:
    images:
      rhel-7-factory-os-ready:
      - id: 79334504-3e48-4411-b602-afe920e32e14
        updated: '2019-05-04T15:51:00Z'
      - id: 79334504-3e48-4411-b602-afe920e32e14
        updated: '2019-05-01T15:51:00Z'
      - id: 79334504-3e48-4411-b602-afe920e32e14
        updated: '2019-05-07T15:51:00Z'
      rhel-6-factory-os-ready:
      - id: 79334504-3e48-4411-b602-afe920e32e14
        updated: '2019-05-09T15:51:00Z'
      - id: 79334504-3e48-4411-b602-afe920e32e14
        updated: '2019-05-03T15:51:00Z'
      - id: 79334504-3e48-4411-b602-afe920e32e14
        updated: '2019-05-01T15:51:00Z'
      thing-with-a-single-image:
      - id: 12345678-1234-1234-1234-123456789123
        updated: '2019-05-01T15:51:00Z'

  tasks:
    - debug:
        msg:
          image_name: "{{ item.key }}"
          image_to_delete: "{{ item.value|sort(attribute='updated')|first }}"
      when: item.value|length > 1
      loop: "{{ images|dict2items }}"
      loop_control:
        label: "{{ item.key }}"

thenwhen语句是为了确保如果图像是列表中的唯一项目,我们不会删除它。

这将产生:

TASK [debug] **********************************************************************************
ok: [localhost] => (item=rhel-6-factory-os-ready) => {
    "msg": {
        "image_name": "rhel-6-factory-os-ready",
        "image_to_delete": {
            "id": "79334504-3e48-4411-b602-afe920e32e14",
            "updated": "2019-05-01T15:51:00Z"
        }
    }
}
ok: [localhost] => (item=rhel-7-factory-os-ready) => {
    "msg": {
        "image_name": "rhel-7-factory-os-ready",
        "image_to_delete": {
            "id": "79334504-3e48-4411-b602-afe920e32e14",
            "updated": "2019-05-01T15:51:00Z"
        }
    }
}
skipping: [localhost] => (item=thing-with-a-single-image)

推荐阅读