Ansible Jinja2模板如何将指定字符串拆分转换为可调用的键值对字典
实现方案
你可以直接通过Jinja2内置的过滤器链完成字符串到字典列表的转换,不需要额外自定义插件,具体操作步骤如下:
步骤1:定义原始字符串变量
在Ansible playbook中先定义你拿到的原始学生字符串:
vars: raw_student_str: "studId=ValueA,studName=valueB;studId=ValueC,studName=ValueD"
步骤2:转换为字典列表
通过set_fact结合过滤器链完成格式转换:
- name: 处理学生字符串为可遍历的字典列表 set_fact: student_list: >- {{ raw_student_str.split(';') | map('split', ',') | map('map', 'split', '=') | map('items2dict') | list }}
过滤器链逻辑说明:
- 先按
;分割原始字符串,得到每个学生的独立属性段 - 对每个学生属性段按
,分割,得到单条key=value格式的属性 - 对每条属性按
=分割为键、值两个元素 - 把每个学生的键值对集合转换为字典
- 最后把所有学生字典组装为列表
如果你使用的是Ansible 2.9及更早版本,没有内置
items2dict过滤器,可以用下面的写法替换转换逻辑:- name: 兼容旧版本Ansible的转换逻辑 set_fact: student_list: >- {% set result = [] %} {% for student_segment in raw_student_str.split(';') %} {% set student_dict = {} %} {% for kv in student_segment.split(',') %} {% set key, val = kv.split('=', 1) %} {% set _ = student_dict.update({key: val}) %} {% endfor %} {% set _ = result.append(student_dict) %} {% endfor %} {{ result }}
步骤3:在Jinja2模板中遍历使用
模板内容直接按你预期的写法即可:
{% for item in student_list %} student id={{ item.studId }} student name= {{ item.studName }} {% endfor %}
渲染后输出效果和你要求的完全一致。
内容的提问来源于stack exchange,提问作者josh
相关产品推荐
相关产品推荐

