Ansible:通过Jinja2展平字典嵌套列表并筛选子列表
问题描述
现有一个字典嵌套列表的结构,内部数据可包含任意复杂度的类型(字符串、字典或多层嵌套对象),示例结构如下:
my_dict: my_list_a: - a - b - c my_list_b: - a - d - e list_c: - f
需要完成两个目标:
- 通过Jinja2将该结构展平为单一列表(无需严格保留顺序),目标格式如下:
my_combined_list: - a - b - c - a - d - e - f
- 在合并过程中基于条件筛选子列表,例如仅保留键名以
my_开头的子列表,排除list_c。
解决方案
由于Jinja2不支持列表推导式,我们可以通过嵌套for循环结合条件判断来实现需求:
核心实现代码
{% set my_combined_list = [] %} {% for key, value in my_dict.items() %} {% if key starts with 'my_' %} {% for item in value %} {% do my_combined_list.append(item) %} {% endfor %} {% endif %} {% endfor %} # 输出合并后的列表 my_combined_list: {{ my_combined_list }}
关键说明
- 使用
{% do %}语句直接操作列表(注意:Jinja2默认未启用do扩展,在Ansible这类常用环境中是默认开启的,若需单独启用可在环境配置中添加extensions=['jinja2.ext.do'])。 - 条件判断
key starts with 'my_'用于筛选符合要求的子列表,可根据实际需求修改判断逻辑(比如匹配特定后缀、包含指定字符串等)。 - 对于多层嵌套的复杂对象,只要子项是可遍历的列表结构,内层循环会自动逐个处理其中的元素,无需额外修改代码。
内容的提问来源于stack exchange,提问作者kittydoor
相关产品推荐
相关产品推荐

