第三章: 解锁Jinja2模版能力

解锁Jinja2模版的能量

模版是ansible的命脉。从配置文件内容到任务中的变量替换,到条件语句及其以后,模版几乎可以与每个可操作的方面都可以一起发挥作用。ansible的模版引擎是Jinja2, 它是python的一种现代的、设计友好的模版语言。本章将介绍Jinja2的一些高级特性。

  • 控制结构。
  • 数据操作。
  • 对比。

控制结构

在Jinja2中,控制结构是模版中控制引擎解析模版流程的一些东西。这些结构包括但不限于条件、循环、以及宏。在Jinja2中,控制结构是出现在{% ... %}块里边的。使用开笔块告诉Jinja2解析器,这是提供了一个控制语句,而不是普通的字符串或变量名。

条件

下面使用条件语句创建了一个demo.j2模版文件。

setting = {{ setting }}
{% if feature.enabled %}
feature = True
{% else %}
feature = False
{% endif %}
another_setting = {{ another_setting }}

下面是使用demo.j2的剧本template-demo.yaml内容:

---
- name: demo the template
  hosts: localhost
  gather_facts: false
  vars:
    setting: a_val
    feature:
      enabled: true
    another_setting: b_val
  tasks:
    - name: pause with render
      pause:
        prompt: "{{ lookup('template', 'demo.j2') }}"

行内条件语句

API = cinder{{ 'v2' if api.v2 else '' }}

循环语句

# data dirs
{% for dir in data_dirs %}
data_dir = {{ dir }}
{% else %}
# no data dirs found
{% endfor %}

过滤循环items

# data dirs
{% for dir in data_dirs %}
{% if dir != "/" %}
data_dir = {{ dir }}
{% endif %}
{% else %}
# no data dirs found
{% endfor %}
# data dirs
{% for dir in data_dirs if dir != "/" %}
data_dir = {{ dir }}
{% else %}
# no data dirs found
{% endfor %}

循环索引

  • loop.index: 循环当前迭代(从1开始)。
  • loop.index0: 循环当前迭代(从0开始)。
  • loop.revindex: 循环迭代的数量(从1开始)。
  • loop.revindex0: 循环迭代的数量(从0开始)。
  • loop.first: 是否为迭代的第一步。
  • loop.last: 是否为迭代的最后一步。
  • loop.length: 序列中元素的数量。

{% macro comma(loop) %}
{{ ',' if not loop.last else '' }}
{%- endmacro -%}
# data dirs.
{% for dir in data_dirs if dir != "/" %}
{% if loop.first %}
data_dir = {{ dir }}{{ comma(loop) }}
{% else %}
{{ dir }}{{ comma(loop) }}
{% endif %}
{% else %}
# no data dirs found
{% endfor %}

宏变量

  • varargs: The varargs variable is a holding place for additional unexpected positional arguments passed along to the macro. These positional argument values will make up the varargs list.
  • kwargs: The kwargs variable is like varargs; however, instead of holding extra positional argument values, it will hold a hash of extra keyword arguments and their associated values.
  • caller: The caller variable can be used to call back to a higher level macro that may have called this macro (yes, macros can call other macros).

数据操作

除了控制结构影响模版处理流程,另外还有一个修改变量内容的工具。这个工具叫做过滤器。过滤器就像可以在变量上面运行的小程序或方法。有些过滤器操作无需参数,有些则需要一些参数。过滤器也可以链起来,也就是前面的过滤器内容会喂给下一个过滤器,以此类推。Jinja2有很多内置的过滤器,ansible对它们进行了扩展,在ansible的Jinja2模版、任务、或其他允许模版的地方文件中可以使用。

语法

{{ my_mode | lower }}

{{ answers | replace('no', 'yes') }}

{{ answers | replace('no', 'yes') | lower }}

有用的内置过滤器

{{ some_variable | default('default_value') }}

{{ play_hosts | count }}

{{ groups['db_servers'] | random }}

{{ math_result | round | int }}

ansible提供的有用内置过滤器

与任务状态相关的过滤器

对比值

总结

目录

  • 第二章: 使用ansible保护你的秘密
  • 目录: 掌握ansible(Mastering ansible)
  • 第四章: 控制任务条件

你可能感兴趣的:(ansible,运维自动化)