空白为什么重要
模板标签两侧的空格与换行会原样进入渲染结果,生成配置文件时经常多出空行或缩进错位。控制手段有两类:在标签两侧加减号做局部修剪,或开启全局的块修剪与行首修剪。掌握这几条规则之后,模板产出的文件才能与手工维护的版本保持一致,后续的差异比对也不会一直显示大量无意义的空白变动。
基本信息
| 局部控制 | 标签左侧的减号去掉前导空白,右侧的减号去掉尾随换行 |
|---|---|
| 全局开关 | 块修剪去掉块标签后的第一个换行,行首修剪去掉行首到标签的空白 |
| 常见症状 | 多出空行、缩进丢失、文件末尾多一个换行 |
| 验证方式 | 本地渲染或先跑演练模式对比差异 |
典型使用场景
- 生成对格式敏感的配置(服务配置、键值文件):需要精确控制空行
- 用迭代生成列表项:要求每项一行且不夹带多余空行
- 生成脚本文件:行首缩进必须正确,否则解释行为会变
- 排查渲染结果与预期不符:先怀疑空白而不是语法
- 模板中需要保留人为空行:避免全局修剪,改用局部控制
修剪的两种写法
修剪的两种写法
# 局部修剪:左侧减号去掉前导空白,右侧减号去掉尾随换行
{%- for host in groups['web'] %}
server {{ host }};
{%- endfor %}
# 单独一行取值并去掉换行,便于拼进一行内容
{{- inventory_hostname -}}写法与作用
| 写法 | 作用 | 适用场合 |
|---|---|---|
| 左侧减号 | 去掉标签左侧空白 | 行首控制语句 |
| 右侧减号 | 去掉标签右侧换行 | 避免多出空行 |
| 块修剪开关 | 块标签后的换行不输出 | 统一风格,适合多数模板 |
| 行首修剪开关 | 行首到块标签的空白不输出 | 兼顾模板可读性与输出格式 |
修剪是双向的:减号用多了会把本该保留的缩进一起吃掉,生成脚本类文件时尤其明显。改完先看渲染结果再决定是否保留修剪。
全局开启修剪会改变已有模板的输出,可能让大量机器的配置一次性变更。先在本地渲染对比,确认差异只是空白,再决定是否全局启用。
与差异比对的配合
模板生成的文件最好交给配置管理而不是手工编辑:手工补的空行会在下次渲染时消失,差异永远不干净,久而久之没人再看得懂改动。确实需要保留的特殊格式,写进模板本身并加注释说明原因,比留在目标机上靠谱。