【问题标题】:Jinja2 for loop over a list of objects doesnt give preferred outputJinja2 for 循环遍历对象列表没有给出首选输出
【发布时间】:2021-04-09 12:12:50
【问题描述】:

data.yml 结构:

routingConfig:
   accessKeyId: AKIAVL34FWX5KFFSVSCND
   secretAccessKey: IglNnjk/iaR++DnQuNObAnrXsvsd9ZO+gJW5nZDd
   hostedZoneId: Z03431513GGUF3XEAQE5U
   recordSet:
      type: A
      ttl: 60
      resourceIp: 52.41.8.70

jinja2模板sn-p重新生成yml结构:

routingConfig:
{% for key,value in routingConfig.items() if value.recordSet is not defined %}
{{ key|e }}: {{ value|e }}
{% endfor %}
recordSet:
{% for key,value in routingConfig.items() if value.recordSet is defined %}
{{ key|e }}: {{ value|e }}
{% endfor %}

实际输出:

routingConfig:
  recordSet: {u'type': u'A', u'resourceIp': u'52.71.3.72', 
  accessKeyId: AKIAVL34FWX5KFSTDFDFNCND
  secretAccessKey: IglNnjk/iaR++DnQuNObAnrXRrbfvdfvd9ZO+gJW5nZDd
  hostedZoneId: Z03431513GGUF3XEFBDVAQE5U

预期的输出格式:

routingConfig:
   accessKeyId: AKIAVL34FWX5KFFSVSCND
   secretAccessKey: IglNnjk/iaR++DnQuNObAnrXsvsd9ZO+gJW5nZDd
   hostedZoneId: Z03431513GGUF3XEAQE5U
   recordSet:
      type: A
      ttl: 60
      resourceIp: 52.41.8.70

任何建议以与预期格式相同的结构获得输出?

{{ routingConfig | to_yaml(default_flow_style=False) | indent(2) }} 

这给出了以下 yml 格式。但是好像缩进不太对

 routingConfig:
 accessKeyId: AKIAVL34FWX5KFDFBSTNCND
    recordSet:
      type: A
      ttl: 60
      resourceIp: 52.41.8.70
    secretAccessKey: IglNnjk/iaR++DnQuNObDFBAnrXsvsd9ZO+gJW5nZDd
    hostedZoneId: Z03431513GGUF3XEADGBDQE5U

【问题讨论】:

    标签: ansible yaml jinja2


    【解决方案1】:

    首先,在 YAML 模板中使用 |e 是没有意义的,因为它会进行 HTML 转义,而不是 YAML 转义。请改用|to_yaml。根据您的数据(您没有显示),这可能已经足够了:

    routingConfig:
      {{ routingConfig | to_yaml(default_flow_style=False) | indent(2) }}
    

    请注意,如果您想强制某个键的顺序,则需要单独输出它们:

    routingConfig:
      {% set c = routingConfig -%}
      accessKeyId: {{ c.accessKeyId | to_yaml }}
      secretAccessKey: {{ c.secretAccessKey | to_yaml }}
      hostedZoneId: {{ c.hostedZoneId | to_yaml }}
      recordSet:
        {% set r = c.recordSet -%}
        type: {{ r.type | to_yaml }}
        ttl: {{ r.ttl | to_yaml }}
        resourceIp: {{ r.resourceIp | to_yaml }}
    

    【讨论】:

    • 感谢您的回答,但输出中有大括号。更新了问题
    • @jsb9009 编辑了禁止流样式的答案。尽管请注意花括号 有效的 YAML。
    • 它有效.. 但是缩进没有:(。更新了问题
    • @jsb9009 看来您没有正确缩进第二行。在您的编辑中,您确实显示它没有缩进,这就是为什么 accessKeyId 没有正确缩进的原因。
    【解决方案2】:

    假设 routingConfig 已经是一个字典,您是否考虑过在模板中使用 to_yaml filter

    routingConfig:
        {{ routingConfig | to_yaml | indent }}
    

    【讨论】:

    • indent 默认情况下不缩进第一行。您要么需要将模板中的第二行缩进 4 个空格,要么提供 indentfirst=True
    • 感谢您的回答,但输出中有大括号。更新了问题
    猜你喜欢
    • 2017-09-06
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多