首页/系统与基础设施/自动化运维速查/模板渲染的空白与换行控制
Ansible 核心70 条

模板渲染的空白与换行控制

模板标签两侧的空白会进入渲染结果;用标签两侧的减号做局部修剪,或用块修剪与行首修剪两个全局开关统一风格,改完先本地渲染对比,避免批量下发时格式意外变动。

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌​‌​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​‌​‌​​‌‌​​​​‌​​‌‌​​‌​​​‌​‌‌​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​‌‌​‌​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌‌​‌‌‌​‌‌​‌​​​​‌‌​‌​​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌‌​​‌‌​‌‌‌​​​​​‌‌​​​​‌​‌‌​​​‌‌​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​‌‌‌​‌​​​‌‌‌​​‌​​‌‌​‌‌‌‌​‌‌​‌‌​​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

空白为什么重要

模板标签两侧的空格与换行会原样进入渲染结果,生成配置文件时经常多出空行或缩进错位。控制手段有两类:在标签两侧加减号做局部修剪,或开启全局的块修剪与行首修剪。掌握这几条规则之后,模板产出的文件才能与手工维护的版本保持一致,后续的差异比对也不会一直显示大量无意义的空白变动。

基本信息

局部控制标签左侧的减号去掉前导空白,右侧的减号去掉尾随换行
全局开关块修剪去掉块标签后的第一个换行,行首修剪去掉行首到标签的空白
常见症状多出空行、缩进丢失、文件末尾多一个换行
验证方式本地渲染或先跑演练模式对比差异

典型使用场景

  • 生成对格式敏感的配置(服务配置、键值文件):需要精确控制空行
  • 用迭代生成列表项:要求每项一行且不夹带多余空行
  • 生成脚本文件:行首缩进必须正确,否则解释行为会变
  • 排查渲染结果与预期不符:先怀疑空白而不是语法
  • 模板中需要保留人为空行:避免全局修剪,改用局部控制

修剪的两种写法

修剪的两种写法
# 局部修剪:左侧减号去掉前导空白,右侧减号去掉尾随换行
{%- for host in groups['web'] %}
server {{ host }};
{%- endfor %}

# 单独一行取值并去掉换行,便于拼进一行内容
{{- inventory_hostname -}}

写法与作用

写法作用适用场合
左侧减号去掉标签左侧空白行首控制语句
右侧减号去掉标签右侧换行避免多出空行
块修剪开关块标签后的换行不输出统一风格,适合多数模板
行首修剪开关行首到块标签的空白不输出兼顾模板可读性与输出格式
修剪是双向的:减号用多了会把本该保留的缩进一起吃掉,生成脚本类文件时尤其明显。改完先看渲染结果再决定是否保留修剪。
全局开启修剪会改变已有模板的输出,可能让大量机器的配置一次性变更。先在本地渲染对比,确认差异只是空白,再决定是否全局启用。

与差异比对的配合

模板生成的文件最好交给配置管理而不是手工编辑:手工补的空行会在下次渲染时消失,差异永远不干净,久而久之没人再看得懂改动。确实需要保留的特殊格式,写进模板本身并加注释说明原因,比留在目标机上靠谱。

易错点

  • 只在标签一侧加减号,另一侧多出的空行仍留在生成文件里
  • 全局开启块修剪后,原本有意的空行被去掉,配置可读性与预期不符
  • 迭代块里每行都加修剪,把行首缩进也吞掉,脚本缩进错乱
  • 生成文件末尾多出换行,与手工维护版本反复互相覆盖,差异比对永不干净
  • 模板改动后不做本地渲染对比就全量下发,大批机器配置格式同时变动

数据来源与参考

  • Jinja2 官方文档 Whitespace Control
  • Ansible 官方文档 Templating(Jinja2)
  • Ansible 官方文档 Template 模块

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/automation/jinja2-template-whitespace-control.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌​‌​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​‌​‌​​‌‌​​​​‌​​‌‌​​‌​​​‌​‌‌​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​‌‌​‌​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌‌​‌‌‌​‌‌​‌​​​​‌‌​‌​​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌‌​​‌‌​‌‌‌​​​​​‌‌​​​​‌​‌‌​​​‌‌​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​‌‌‌​‌​​​‌‌‌​​‌​​‌‌​‌‌‌‌​‌‌​‌‌​​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​