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

如何为Jinja变量应用正确过滤器以获取带正确缩进的变量列表

Ansible Jinja模板中保持YAML变量正确缩进的解决方法

问题场景

在Ansible角色中使用Jinja模板生成netplan配置时,vm_routes变量渲染后无法保持正确缩进格式,导致输出的YAML结构异常。尝试to_yaml、to_nice_yaml过滤器后仍未解决缩进混乱问题。

现有模板代码

network:
  version: 2
  ethernets:
    {{ vm_guest_interface }}:
      dhcp4: no
      addresses: [{{ vm_static_ip }}]
      nameservers:
           addresses: [{{ vm_dns_servers }}]
      routes: 
        {{ vm_routes }}

vars.yaml中的vm_routes定义

vm_routes: 
  - to: 0.0.0.0/0
    via: 192.168.0.1
  - to: 192.168.0.0/16
    via: 192.168.0.101

预期正确输出

network:
  version: 2
  ethernets:
    {{ vm_guest_interface }}:
      dhcp4: no
      addresses: [{{ vm_static_ip }}]
      nameservers:
           addresses: [{{ vm_dns_servers }}]
      routes: 
        - to: 0.0.0.0/0
          via: 192.168.0.1
        - to: 192.168.0.0/16
          via: 192.168.0.101

解决方法

方法1:组合to_nice_yaml与indent过滤器

通过Jinja过滤器组合精准控制YAML渲染后的缩进,修改模板中routes部分代码为:

routes: 
{{ vm_routes | to_nice_yaml(indent=2) | indent(width=2, indentfirst=False) }}
  • to_nice_yaml(indent=2):将变量转换为格式化YAML,让列表项的子字段(如via)缩进2个空格
  • indent(width=2, indentfirst=False):给整个YAML块添加2个空格缩进,但跳过第一行,避免列表项的-被额外缩进

方法2:手动循环渲染变量

如果变量结构简单,直接通过Jinja循环手动控制缩进,更直观可靠:
修改模板中routes部分代码为:

routes: 
{% for route in vm_routes %}
  - to: {{ route.to }}
    via: {{ route.via }}
{% endfor %}

这种方式完全由开发者控制每一行的缩进,不会出现过滤器导致的格式偏差。

总结

  • 若变量结构复杂(包含多层嵌套),优先使用过滤器组合方式,减少手动代码量
  • 若变量结构简单,手动循环渲染能避免过滤器的潜在格式问题,更易调试

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:54:56