首页 > 解决方案 > ansible/jinja2 how to get dict from list of merged dicts

问题描述

I'm trying to get a dictionary from list of dictionaries, where: key - it is value of all merged dictionaries items; value - list of items name included into some item.

Another words I need to get dictionary of all roles (as keys) and name of item that has this role (as values).

Example data 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

I'd like to get file like:

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

It is easy on python, but very difficult on ansible. How to do that?

标签: ansiblejinja2

解决方案


这是您要查找的代码吗?

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

推荐阅读