Warm tip: This article is reproduced from serverfault.com, please click

其他-使用Jinja2在ansible中创建字典列表时出现问题

(其他 - Issue creating a list of dictionaries in ansible using Jinja2)

发布于 2020-12-01 19:38:08

我正在尝试通过解析2个列表在Ansible中创建词典列表,下面是代码。

- name: Create list of data dictionary 
  vars:
     _sinfo: |-
       {% for data in data_list|default([]) %}
       {%- if item in data['subject'] %}
       [{ grade: {{data['grade']}}, id: {{data['id']}}, subject: {{data['subject']}} }]
       {%- endif -%}
       {% endfor %}
  set_fact:
    data_dict_list: "{{ data_dict_list|default([]) + _sinfo|list}}"
  with_items: 
    - "{{ subject_list }}"

上面的脚本为我提供了一个字典列表,其中每个字符串都分成字母并使用

data_dict_list: "{{ data_dict_list|default([]) + _sinfo|list|join}}"

给我错误

msg: 'Unexpected templating type error occurred on ({{ data_dict_list|default([]) + _sinfo | list | join}}): can only concatenate list (not "unicode") to list'

清单值: [u''Physics'', u''Chemistry'', u''Biology'', u''Math'', u''Geology'']

库存文件:

data_list:
  - id: 31
    grade: ['A+']
    subject: Physics
  - id: 40
    grade: ['B']
    subject: Math
  - id: 30
    grade: ['A']
    subject: Biology
  - id: 33
    grade: ['A+']
    subject: Physics
  - id: 35
    grade: ['A+', 'B+']
    subject: Physics

注意:
Ansible版本:2.7.7
Python版本:2.7.18
Jinja2版本:2.11.2

我要做的是按主题对数据进行分组,并创建一个主题列表,每个主题词典都包含该主题的所有数据。

Questioner
moooni moon
Viewed
11
Vladimir Botka 2020-12-02 07:48:34

问:“按主题对数据进行分组,并创建一个主题列表,每个主题词典都包含该主题的所有数据”

答:下面的任务

    - set_fact:
        list_subj: "{{ list_subj|default([]) + [{item.0: item.1}] }}"
      loop: "{{ data_list|groupby('subject') }}"
    - debug:
        var: list_subj

给出字典列表

  list_subj:
  - Biology:
    - grade:
      - A
      id: 30
      subject: Biology
  - Math:
    - grade:
      - B
      id: 40
      subject: Math
  - Physics:
    - grade:
      - A+
      id: 31
      subject: Physics
    - grade:
      - A+
      id: 33
      subject: Physics
    - grade:
      - A+
      - B+
      id: 35
      subject: Physics

但是,在这里词典可能更实用。例如

    - set_fact:
        dict_subj: "{{ dict(data_list|groupby('subject')) }}"
    - debug:
        var: dict_subj

  dict_subj:
    Biology:
    - grade:
      - A
      id: 30
      subject: Biology
    Math:
    - grade:
      - B
      id: 40
      subject: Math
    Physics:
    - grade:
      - A+
      id: 31
      subject: Physics
    - grade:
      - A+
      id: 33
      subject: Physics
    - grade:
      - A+
      - B+
      id: 35
      subject: Physics