Jinja模板中创建的dictionary无法访问值仅可读取key问题求助
问题原因
你代码中生成的dictonary_obj并非Ansible可识别的原生字典对象,而是字符串类型的字典文本,因此无法通过key访问对应value:
set_fact使用|多行字符串块标记,Jinja默认将块内的渲染结果识别为字符串类型- 最后一行代码额外用双引号包裹
{{ record_info }},强制输出为带引号的字符串 - Ansible不会自动将字典格式的字符串解析为原生字典,你调用
dictonary_obj[item]时实际是对字符串做下标索引,无法得到预期结果。你可以通过debug: var=dictonary_obj | type_debug验证,输出会是AnsibleUnsafeText而非dict。
修复方案
方案1:保留循环逻辑,转换为原生字典
修改字典构建代码,去掉多余的双引号,添加过滤器将渲染结果转为字典:
- set_fact: dictionary_obj: >- {% set record_info = dict() %} {% for item in list %} {% set _dummy = record_info.update({ item: 0 }) %} {% endfor %} {{ record_info | to_json }} - set_fact: dictionary_obj: "{{ dictionary_obj | from_json }}"
这里用
>-替代|是为了自动去除渲染结果末尾的换行符,避免JSON解析失败。
方案2:简化写法,直接生成字典
无需手动写循环,直接调用Jinja内置的dict.fromkeys方法即可一键生成符合要求的字典,代码更简洁:
- set_fact: dictionary_obj: "{{ dict.fromkeys(list, 0) }}"
修改完成后原有的debug访问代码无需调整,即可正常通过key获取对应的value。
内容的提问来源于stack exchange,提问作者Ezra T
相关产品推荐
相关产品推荐

