LabHub
学习 学习路径 课程

Ansible 实战

用 Jinja2 生成配置文件

在 LabHub 中继续学习

目标

把不同环境的配置文件拆分为一个模板和多组数据,确保渲染结果整洁、经过验证后再部署。

为什么重要

如果为每个环境各维护一份配置文件,这些文件最终一定会彼此偏离。模板通过“结构一份、数据多份”消除这种分叉。实际工作中,破坏模板的往往不是语法,而是两个问题。其一是空白——控制语句留下的空行可能破坏 YAML 配置。其二是每次都不同的渲染结果——仅仅一行时间戳就会让文件在每次运行时改变,进而每次都触发 handler 并重启服务。最后,validate 是阻止错误配置导致服务宕机的最低成本安全措施。一旦启用自动部署,这个选项就不再是可选项。

步骤

  1. 本实验只使用一个 playbook:/root/ans/tpl/site.yml。通过 /root/ans/tpl/templates/basic.j2 创建 /root/ans/tpl/out/basic.conf,结果中必须有 service = checkout 行。
  2. 通过 /root/ans/tpl/templates/filters.j2 创建 /root/ans/tpl/out/filters.conf,输出三行:UPPER=CHECKOUTTIMEOUT=30(未定义变量的默认值)、REPLICAS=3
  3. 通过 /root/ans/tpl/templates/upstream.j2 创建 /root/ans/tpl/out/upstream.conf。三个后端要分别以 server 10.0.0.11:8080; 的形式各占一行。
  4. 用不同变量渲染同一个模板,创建 /root/ans/tpl/out/prod.conftls = on,无 debug)和 /root/ans/tpl/out/dev.conftls = off,有 debug)。
  5. 控制空白,使 upstream.conf 中没有任何空行,server 行前也没有多余缩进。可以使用 {%- -%},或在 /root/ans/tpl/site.ymltemplate task 中启用 trim_blocks/lstrip_blocks
  6. 通过 /root/ans/tpl/templates/node.j2 创建 /root/ans/tpl/out/node.confhostnamearch 来自 fact,generated_for 来自 inventory_hostname(=web1)。
  7. /root/ans/tpl/site.ymltemplate task 中加入 validatebackup: true,创建 /root/ans/tpl/out/validated.conf。内容只有一行 key=value
  8. 创建 /root/ans/tpl/out/site.nginx。在 upstream checkout_backend { 块内放入 3 行缩进 4 个空格的 server,并分别加入缩进 4 个空格的 listen 8080;server_name checkout.labhub.internal;。空行不得超过 1 行。

参考

渲染带变量的基础模板

本实验只使用一个 playbook:/root/ans/tpl/site.yml。通过 /root/ans/tpl/templates/basic.j2 创建 /root/ans/tpl/out/basic.conf,结果中必须有 service = checkout 行。

使用 {{ 변수 }} 输出值。如果结果中仍有 Jinja2 语法,说明尚未完成渲染。

使用 upper 和 default 过滤器

通过 /root/ans/tpl/templates/filters.j2 创建 /root/ans/tpl/out/filters.conf,输出三行:UPPER=CHECKOUTTIMEOUT=30(未定义变量的默认值)、REPLICAS=3

过滤器使用管道连接。想一想,哪个过滤器可以为未定义变量提供默认值。

添加遍历列表的循环

通过 /root/ans/tpl/templates/upstream.j2 创建 /root/ans/tpl/out/upstream.conf。三个后端要分别以 server 10.0.0.11:8080; 的形式各占一行。

{% for %}{% endfor %} 之间放入需要重复的行。三个后端必须各占一行。

按环境输出不同配置

用不同变量渲染同一个模板,创建 /root/ans/tpl/out/prod.conftls = on,无 debug)和 /root/ans/tpl/out/dev.conftls = off,有 debug)。

用不同变量渲染同一模板两次。prod 中不得出现 debug。

通过空白控制消除空行

控制空白,使 upstream.conf 中没有任何空行,server 行前也没有多余缩进。可以使用 {%- -%},或在 /root/ans/tpl/site.ymltemplate task 中启用 trim_blocks/lstrip_blocks

使用 {%- / -%},或 template 模块的 trim_blocks/lstrip_blocks。结果中不能有任何空行。

在模板中使用 fact 和 inventory_hostname

通过 /root/ans/tpl/templates/node.j2 创建 /root/ans/tpl/out/node.confhostnamearch 来自 fact,generated_for 来自 inventory_hostname(=web1)。

fact 变量以 ansible_ 开头,目标名称则是 inventory_hostname。

添加 validate 和 backup

/root/ans/tpl/site.ymltemplate task 中加入 validatebackup: true,创建 /root/ans/tpl/out/validated.conf。内容只有一行 key=value

validate 会把临时文件路径放入 %s。如果校验失败,文件就不会被部署。

用组变量生成完整 nginx 配置

创建 /root/ans/tpl/out/site.nginx。在 upstream checkout_backend { 块内放入 3 行缩进 4 个空格的 server,并分别加入缩进 4 个空格的 listen 8080;server_name checkout.labhub.internal;。空行不得超过 1 行。

upstream 块中的 server 行需要缩进 4 个空格。请结合使用空白控制和循环。