模版是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 %}
# 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 %}
{% 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 %}
除了控制結構影響模版處理流程,另外還有一個修改變量內容的工具。這個工具叫作過濾器。過濾器就像能夠在變量上面運行的小程序或方法。有些過濾器操做無需參數,有些則須要一些參數。過濾器也能夠鏈起來,也就是前面的過濾器內容會餵給下一個過濾器,以此類推。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 }}