簡體   English   中英

ansible / jinja2如何從合並的字典列表中獲取字典

[英]ansible/jinja2 how to get dict from list of merged dicts

我正在嘗試從詞典列表中獲取字典,其中:key-它是所有合並的詞典項目的值; 值-某些項目中包含的項目名稱列表。

換句話說,我需要獲取所有角色的字典(作為鍵)和具有該角色的項的名稱(作為值)。

數據示例yaml:

hostgroups:
  - name: a-node
    roles:
      - aaa
      - bbb
      - ccc
      - ddd
      - eee

  - name: b-node
    roles:
      - ccc
      - ddd

  - name: c-node
    roles:
      - ccc
      - ddd
      - zzz

  - name: d-node
    roles:
      - ccc
      - ddd

我想獲取如下文件:

aaa:
  a-node
bbb:
  b-node
ccc:
  a-node
  b-node
  c-node
  d-node
ddd:
  a-node
  b-node
  c-node
  d-node
eee:
  a-node
zzz:
  c-node

在python上很容易,但是在ansible上卻很難。 怎么做?

這是您要查找的代碼嗎?

vars:
  hostgroups:
      ...
  role_groups: {}
tasks:
  - set_fact:
      role_list: "{{ hostgroups|json_query('[].roles')|flatten|unique }}"
  - set_fact:
      role_groups: "{{ role_groups|combine( { item: hostgroups|json_query(query) } ) }}"
    vars:
      query: "[?roles.contains(@, '{{ item }}')].name"
    loop: "{{ role_list  }}"

感謝大家的答復,但我找到了解決方法:

- name: step 1
  set_fact:
    temp_1: "{{ temp_1|default([]) + [{'role': item.1, 'hostgroup': item.0.name }] }}"
  with_subelements:
    - "{{ hostgroups }}"
    - roles

- name: Debug 2
  check_mode: no
  blockinfile:
    dest: hosts
    marker: "# {mark} Auto block {{ item[0] }}"
    block: |
           [{{ item[0]}}]
           {% for i in item[1] %}
           {{ i.hostgroup }}
           {% endfor %}
  with_items:
    - "{{ temp_1 | groupby('role') | list  }}"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM