一、为什么要学 Jinja2 模板

原始笔记提到,Jinja2 常见于:

  • 使用 template 模块分发配置文件
  • 在模板中做判断
  • 在模板中做循环

这意味着,当配置文件里需要根据主机不同而动态生成内容时,就不能只靠普通 copy 模块,而要借助模板能力。

二、template 模块和 .j2 文件是什么关系

原始笔记的核心观点很清楚:

  • 配合 template 模块使用的是 .j2 模板文件
  • 模板文件中可以写变量、判断和循环

常见文件名形态包括:

  • nginx.conf.j2
  • motd.j2

所以可以简单理解为:

  • .j2 负责定义动态内容
  • template 负责把模板渲染并分发到目标主机

三、Jinja2 的基础用法:批量修改 /etc/motd

原始笔记中的第一个案例,是根据主机 facts 信息批量生成登录提示文件。

3.1 Playbook 示例

- hosts: all
  tasks:
    - name: 分发motd文件(使用template模块)
      template:
        src: templates/motd.j2
        dest: /etc/motd
        backup: yes

    - name: 分发motd文件(使用copy模块)
      copy:
        src: templates/motd.j2
        dest: /tmp/motd
        backup: yes

3.2 模板文件示例

#######################################
操作需谨慎,删根弹指间.
主机名: {{ ansible_hostname }}
ip地址: {{ ansible_default_ipv4.address }}
内存大小: {{ ansible_memtotal_mb }}
CPU数量: {{ ansible_processor_vcpus }}
核心总数: {{ ansible_processor_cores }}
发行版本: {{ ansible_distribution }}

3.3 这个案例最值得注意什么

它很好地体现了:

  • template 会渲染变量
  • copy 不会渲染变量,只是原样复制

所以同一个源文件,通过不同模块分发,最终效果会不同。

四、Jinja2 中如何做条件判断

原始笔记的第二个例子,是根据主机名生成不同的配置内容。

4.1 Playbook 示例

- hosts: all
  tasks:
    - name: 分发配置文件
      template:
        src: templates/keepalived.conf.j2
        dest: /tmp/keepalived.conf

4.2 模板中的 if 写法

{% if ansible_hostname == "oldboy02" %}
  state 主节点
{% elif ansible_hostname == "oldboy02" %}
  state 备节点
{% endif %}

虽然原始示例中的判断条件写法存在可继续优化之处,但它已经清楚演示了 Jinja2 的核心语法:

  • {% if %}
  • {% elif %}
  • {% endif %}

这类写法非常适合:

  • 根据主机名区分主备角色
  • 根据系统类型生成不同配置
  • 根据环境变量输出不同内容

五、Jinja2 中如何做循环

原始笔记的第三个例子展示了 for 循环。

5.1 Playbook 示例

- hosts: all
  tasks:
    - name: 分发配置文件
      template:
        src: templates/server.conf.j2
        dest: /tmp/server.conf

5.2 模板中的 for 写法

{% for ip in range(2,11) %}
 10.0.0.{{ ip }}
{% endfor %}

这个例子很好地体现了 Jinja2 的循环能力:

  • 可以批量生成一组相似配置项
  • 特别适合 Nginx upstream、白名单、后端节点列表等场景

六、Jinja2 在运维中的典型价值

结合原始笔记内容,Jinja2 最大的价值可以概括成三类:

  • 配置文件里使用变量
  • 根据条件渲染不同内容
  • 根据循环批量生成重复结构

这意味着你不再需要给每台服务器手工维护一份几乎相同但又略有差异的配置文件,而是可以:

  • 一份模板
  • 多台主机
  • 自动渲染出不同结果

七、使用模板时一个很重要的思维转变

copy 切换到 template,本质上是从:

  • 静态分发文件

转向:

  • 动态生成目标配置

这也是 Ansible 自动化管理中非常关键的一步。很多服务配置(如 Nginx、Keepalived、MOTD、应用配置文件)都更适合走模板路线。

八、小结

Jinja2 模板入门阶段,最值得掌握的内容有:

  • template 模块和 .j2 文件如何配合
  • {{ 变量 }} 的基础插值写法
  • {% if %} 条件判断
  • {% for %} 循环生成内容
  • templatecopy 的区别

当这些基础点掌握之后,后面的复杂配置文件自动化分发就会容易很多。