Ansible: 하나의 사전 요소를 그룹화된 다른 값 목록과 함께 가져오는 동일한 키를 가진 사전 객체 목록을 병합하는 방법은 무엇입니까?

Ansible: 하나의 사전 요소를 그룹화된 다른 값 목록과 함께 가져오는 동일한 키를 가진 사전 객체 목록을 병합하는 방법은 무엇입니까?

나는 한동안 Ansible과 씨름했고 마침내 가능하다면 도움을 요청했습니다.

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

다음을 얻으려면 그룹화해야 합니다.

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

하지만 지금까지는 "action"+"resource" 키로 그룹화하여 새 필드 "groups"에서 관련 "group" 목록을 가져올 수 없습니다. 나는 { "action"+"resource" : "group1" }, ..., { "action"+"resource" : "groupN" } 형식의 사전 목록만 얻었습니다.

관련 Ansible 작업 코드:

- 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

몇번의 시도 끝에결합하다,노동 조합,그룹바이성공하지 못한 필터.. 어떤 통찰력이라도 높이 평가하겠습니다.

친애하는,

답변1

Jinja로 구조를 만듭니다. 예를 들어, 주어진mre단순화된 데이터

  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: |-
    read:
      groups: [1, 2]
      policy: ['data']

값만 얻을 수 있습니다

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

준다

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

목록의 첫 번째 항목이 귀하가 찾고 있는 항목입니다. 아니면 사전에서 찾아보셔도 됩니다

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

준다

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

테스트를 위한 전체 플레이북의 예

- 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

관련 정보