Ansible: Wie führt man eine Liste von Wörterbuchobjekten mit demselben Schlüssel zusammen, um ein Wörterbuchelement mit einer Liste aus zwei unterschiedlichen gruppierten Werten zu erhalten?

Ansible: Wie führt man eine Liste von Wörterbuchobjekten mit demselben Schlüssel zusammen, um ein Wörterbuchelement mit einer Liste aus zwei unterschiedlichen gruppierten Werten zu erhalten?

Ich habe eine Zeit lang mit Ansible gekämpft und bitte schließlich um jede mögliche Hilfe,

Über einen Satz von Nifi-Richtlinien verfügen:

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

Ich muss sie gruppieren, um Folgendes zu erhalten:

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

Aber bis jetzt kann ich immer noch nicht nach dem Schlüssel „action“+„resource“ gruppieren und eine Liste der zugehörigen „Gruppen“ in einem neuen Feld „groups“ erhalten. Ich habe es nur geschafft, eine Liste von Wörterbüchern in der Form { „action“+„resource“ : „group1“ }, ..., { „action“+„resource“ : „groupN“ } zu erhalten.

Zugehöriger Ansible-Task-Code:

- 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

Nach mehreren Versuchen mitkombinieren,Union,gruppiere nachAnsible-Filter ohne Erfolg.. jede Einsicht wäre sehr willkommen.

Beste grüße,

Antwort1

Erstellen Sie die Struktur mit Jinja. Beispielsweise angesichts dermehrvereinfachte Daten

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

Deklarieren Sie im Wörterbuch, wie die Schlüssel umbenannt werden

    keys:
      group: groups
      resource: policy

und deklarieren Sie die Struktur

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

gibt

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

Sie können die Werte nur

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

gibt

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

Der erste Eintrag in der Liste ist das, wonach Sie suchen. Oder Sie können es aus dem Wörterbuch holen

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

gibt

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

Beispiel eines vollständigen Playbooks zum Testen

- 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

verwandte Informationen