如何在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
相关产品推荐
相关产品推荐

