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

如何在Jinja中格式化含多键值的数据结构?

问题描述

我正在使用以下Jinja模板:

users:
{% for usr in users -%}
{# user {{ usr }} -#}
 - name: {{ users[usr].username }}
   passwd: {{ users[usr].hash }}
   ssh_authorized_keys: {{ users[usr].key }}
{% endfor %}

需要在Jinja模板内定义多层级字典结构存储用户数据(无法使用单独的JSON/YAML文件),预期的数据结构示例如下:

users:
  user1:
    username: queef
    hash: $6$eMRWO7k8SM
    key: 'sha-rsa $6$3EddsggdvX'
  user2:
    username: keagle
    hash: $6$eYYhaSqGDf45sEE
    key: '- sha-rsa $6$3AxxxX10HdvX'

我尝试了如下定义,但渲染时报错expected token ',', got ':':

{% set users = ({"user1" 
                 "Username" : "queef",
                 "Hash" : "$6$eMRWO7k8SM",
                 "Key" : " - sha-rsa $6$3EddsggdvX", 
                 "user2" 
                 "Username" : "keagle",
                 "Hash" : "$6$eYYhaSqGDf45sEE",
                 "Key" : " - sha-rsa $6$3AxxxX10HdvX"  }) -%}

期望的输出结果为:

users:
- name: queef
  passwd: $6$eMRWO7k8SM
  ssh_authorized_keys: - sha-rsa $6$3EddsggdvX
- name: keagle
  passwd: $6$eYYhaSqGDf45sEE
  ssh_authorized_keys: - sha-rsa $6$3AxxxX10HdvX
解决方案

你的错误源于多层字典的语法问题:顶层键(user1、user2)后缺少冒号,子字典未用{}包裹,且键名大小写与模板引用不匹配。

正确的Jinja内联多层字典定义如下:

{% set users = {
    "user1": {
        "username": "queef",
        "hash": "$6$eMRWO7k8SM",
        "key": "- sha-rsa $6$3EddsggdvX"
    },
    "user2": {
        "username": "keagle",
        "hash": "$6$eYYhaSqGDf45sEE",
        "key": "- sha-rsa $6$3AxxxX10HdvX"
    }
} %}

users:
{% for usr in users -%}
{# user {{ usr }} -#}
 - name: {{ users[usr].username }}
   passwd: {{ users[usr].hash }}
   ssh_authorized_keys: {{ users[usr].key }}
{% endfor %}

关键注意点

  • 顶层字典的每个键(如user1)后必须加冒号,对应值为子字典(用{}包裹)
  • 子字典内的键名需与模板中调用的username、hash、key严格匹配(大小写一致)
  • 字典内的键值对之间用逗号分隔,保持格式清晰便于维护

使用上述代码渲染后,即可得到你期望的输出结果。

内容的提问来源于stack exchange,提问作者dj423

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 14:18:11