You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 08:48:03