【问题标题】:ansible/jinja2 how to get dict from list of merged dictsansible/jinja2 如何从合并的字典列表中获取字典
【发布时间】:2018-11-08 01:17:13
【问题描述】:

我正在尝试从字典列表中获取字典,其中: key - 它是所有合并字典项的值; value - 包含在某个项目中的项目名称列表。

换句话说,我需要获取所有角色的字典(作为键)和具有此角色的项目的名称(作为值)。

示例数据 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 上很难。 该怎么做?

【问题讨论】:

标签: ansible jinja2


【解决方案1】:

这是您要查找的代码吗?

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

【讨论】:

    【解决方案2】:

    感谢大家的回复,但我找到了解决办法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-20
      • 2020-12-28
      • 1970-01-01
      • 2011-02-11
      • 2020-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多