解锁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 }}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。