Ansible получить значение ключей из другого списка - PullRequest
0 голосов
/ 09 мая 2019

У меня есть 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 image

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"
}

Я пробовал с нижеуказанным, но не повезло!

- 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_name переменные являются первыми двумя наборами данных соответственно.

Как я могу сделать двойную петлю grouped_by_name из ключей, переданных image_names var?

В случае, если вопрос не ясен, пожалуйста, не стесняйтесь комментировать, я постараюсь перефразировать его.

1 Ответ

1 голос
/ 09 мая 2019

Если я правильно понимаю ваш вопрос, вам вообще не нужен вложенный цикл. Ваша цель для каждого ключа в словаре найти самое старое изображение. Мы можем сделать это так:

- 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 }}"

Тогда when заявление, чтобы убедиться, что мы не удаляем изображение, если оно является единственным элементом в списке.

Это даст:

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)
...