我正在尝试通过解析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
我要做的是按主题对数据进行分组,并创建一个主题列表,每个主题词典都包含该主题的所有数据。
问:“按主题对数据进行分组,并创建一个主题列表,每个主题词典都包含该主题的所有数据”
答:下面的任务
- 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
谢谢,但我仍然得到将字符串分解为单个字符的输出。“ [{item.0:item.1}]”有什么作用?
是什么让您无法看一眼
- debug: msg: "{{ [{item.0: item.1}] }}"
循环中的?我是ansible的新手,因此不确定如何在循环中进行调试,但是现在我知道了,感谢您的帮助。按照您的建议使用字典效果更好。