测验:模板
{{ timeout | default(30) }} 的作用是什么?
- timeout 大于 30 时,截断为上限 30 后使用
- 将 timeout 的求值推迟 30 秒,之后再读取其值
- timeout 未定义或为空时使用 30
- 无论 timeout 是否有值,始终固定为 30
渲染结果中留下了不需要的空行,原因是什么?
{% ... %}控制语句所占的行仍然会被输出- 变量值末尾包含换行符,并被原样输出
- 模板文件的行尾字符为 CRLF,导致换行出现两次
- template 模块写入文件时,会为每一行额外添加一个换行
为什么要使用 template 模块的 validate 选项?
- 仅在渲染结果通过检查时,才将其放到目标路径
- 自动让待部署文件的所有者和权限与原文件一致
- 跳过没有变化的模板,以提高渲染速度
- 预先检查模板引用的变量是否已定义
在模板中加入生成时间注释,会产生什么问题?
- 为了获取时间,每次都会强制收集事实,执行时间明显增加
- 即使启用
backup: yes,只有注释发生变化的文件也不会备份 - Jinja 无法解释注释中的时间表达式,导致渲染失败
- 文件每次执行都会变化并显示 changed,处理程序每次都会运行,导致服务重启
在模板中使用事实时,需要注意什么?
- 在特殊环境中可能出现意外值,因此应准备默认值或分支
- 所有事实都会以字符串形式传入,因此进行数值比较前必须转换为
int - 在引用事实的模板中,template 模块的 backup 选项会被忽略
- 事实只能在任务中引用,不能在模板中使用
模板中叠加了五层 if 分支。最佳改进方向是什么?
- 按环境复制模板,在每个文件中彻底消除分支
- 将分支计算提前到变量准备阶段,保持模板简单
- 为每个分支添加注释,说明对应条件
- 串联过滤器,将五层分支压缩成单行表达式