Ansible: ¿Cómo fusionar una lista de objetos del diccionario con la misma clave obteniendo un elemento del diccionario con una lista de tres valores diferentes agrupados?

Ansible: ¿Cómo fusionar una lista de objetos del diccionario con la misma clave obteniendo un elemento del diccionario con una lista de tres valores diferentes agrupados?

He tenido problemas con Ansible durante un tiempo y finalmente solicito ayuda si es posible.

Tener un conjunto de políticas Nifi:

"nifi_raw_policies": [
    {
        "action": "read",
        "group": "8c052e6c-0184-1000-0000-000072a0bb44",
        "resource": "/data/process-groups/8b6b5c9f-0184-1000-57e3-f27fc56dd4aa"
    },
    {
        "action": "read",
        "group": "8c0536d8-0184-1000-0000-000018ba98a9",
        "resource": "/data/process-groups/8b6b5c9f-0184-1000-57e3-f27fc56dd4aa"
    }
]

Tengo la necesidad de agruparlos para obtener:

"nifi_grouped_policies": [
    {
        "policy": "read/data/process-groups/8b6b5c9f-0184-1000-57e3-f27fc56dd4aa",
        "groups": [ "8c052e6c-0184-1000-0000-000072a0bb44","8c0536d8-0184-1000-0000-000018ba98a9" ]
    }
]

Pero hasta ahora todavía no puedo agrupar por tecla "acción" + "recurso" para obtener una lista de "grupos" relacionados en un nuevo campo "grupos". He logrado obtener solo una lista de diccionarios en el formato { "acción"+"recurso": "grupo1" }, ..., { "acción"+"recurso": "grupoN" }

Código de tarea ansible relacionado:

- name: Declare policies (simplest)
  set_fact:
    nifi_raw_policies: [
        {
            "action": "read",
            "group": "8c052e6c-0184-1000-0000-000072a0bb44",
            "resource": "/data/process-groups/8b6b5c9f-0184-1000-57e3-f27fc56dd4aa"
        },
        {
            "action": "read",
            "group": "8c0536d8-0184-1000-0000-000018ba98a9",
            "resource": "/data/process-groups/8b6b5c9f-0184-1000-57e3-f27fc56dd4aa"
        }
    ]

- name: Declare policies - debug
  debug: var=nifi_raw_policies

- name: Combine action and resource
  set_fact:
    nifi_policies: >-
      {{ nifi_policies|default([])
        | union([{
            item.action + item.resource : item.group
            }])
      }}
  with_items: "{{ nifi_raw_policies }}"

- name: Combine action and resource - debug
  debug: var=nifi_policies

Después de varios intentos usandocombinar,Unión,agrupar porFiltros ansibles sin éxito. Cualquier información sería muy apreciada.

Atentamente,

Respuesta1

Crea la estructura de Jinja. Por ejemplo, dado elseñordatos simplificados

  raw:
    - action: read
      group: 1
      resource: data
    - action: read
      group: 2
      resource: data

declarar el diccionario cómo cambiar el nombre de las claves

    keys:
      group: groups
      resource: policy

y declarar la estructura

  grouped: |
    {% for i in raw|groupby('action') %}
    {{ i.0 }}:
    {% for k in i.1|json_query('[].keys(@)|[]')|unique %}
    {% if k != 'action' %}
      {{ keys[k] }}: {{ i.1|map(attribute=k)|unique }}
    {% endif %}
    {% endfor %}
    {% endfor %}

da

  grouped: |-
    read:
      groups: [1, 2]
      policy: ['data']

Solo puedes obtener los valores.

  grouped_vals: "{{ grouped|from_yaml|dict2items|map(attribute='value')|list }}"

da

  grouped_vals:
    - groups: [1, 2]
      policy: [data]

El primer elemento de la lista es lo que estás buscando. O puedes obtenerlo del diccionario.

  nifi_grouped_policies: "{{ (grouped|from_yaml).read }}"

da

  nifi_grouped_policies:
    groups: [1, 2]
    policy: [data]

Ejemplo de un libro de jugadas completo para realizar pruebas.

- hosts: localhost

  vars:

    raw:
      - action: read
        group: 1
        resource: data
      - action: read
        group: 2
        resource: data

    keys:
      group: groups
      resource: policy
    grouped: |
      {% for i in raw|groupby('action') %}
      {{ i.0 }}:
      {% for k in i.1|json_query('[].keys(@)|[]')|unique %}
      {% if k != 'action' %}
        {{ keys[k] }}: {{ i.1|map(attribute=k)|unique }}
      {% endif %}
      {% endfor %}
      {% endfor %}
    grouped_vals: "{{ grouped|from_yaml|dict2items|map(attribute='value')|list }}"
    nifi_grouped_policies: "{{ (grouped|from_yaml).read }}"

  tasks:

    - debug:
        var: grouped
    - debug:
        var: grouped_vals|to_yaml
    - debug:
        var: nifi_grouped_policies|to_yaml

información relacionada