第三章: 解鎖Jinja2模版能力

解鎖Jinja2模版的能量

模版是ansible的命脈。從配置文件內容到任務中的變量替換,到條件語句及其之後,模版幾乎能夠與每一個可操做的方面均可以一塊兒發揮做用。ansible的模版引擎是Jinja2, 它是python的一種現代的、設計友好的模版語言。本章將介紹Jinja2的一些高級特性。python

  • 控制結構。
  • 數據操做。
  • 對比。

控制結構

在Jinja2中,控制結構是模版中控制引擎解析模版流程的一些東西。這些結構包括但不限於條件、循環、以及宏。在Jinja2中,控制結構是出如今{% ... %}塊裏邊的。使用開筆塊告訴Jinja2解析器,這是提供了一個控制語句,而不是普通的字符串或變量名。小程序

條件

下面使用條件語句建立了一個demo.j2模版文件。api

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

下面是使用demo.j2的劇本template-demo.yaml內容:dom

---
- 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提供的有用內置過濾器

與任務狀態相關的過濾器

對比值

總結

目錄

相關文章
相關標籤/搜索