나는 한동안 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