高度な Jinja2 の技法
この最後のステップでは、マクロやフィルタを含む、いくつかの高度な Jinja2 の技法を探ります。マクロは、プログラミング言語の関数に似た、再利用可能なテンプレートの断片です。
advanced.j2
という名前の新しいテンプレートファイルを作成します。
cd ~/project/templates
nano advanced.j2
次の内容を追加します。
{% macro render_list(title, items) %}
{{ title }}:
{% for item in items %}
- {{ item }}
{% endfor %}
{% endmacro %}
1. マクロの使用:
{{ render_list("Fruits", fruits) }}
{{ render_list("Vegetables", vegetables) }}
2. set の使用:
{% set greeting = "Hello, " + name + "!" %}
{{ greeting }}
3. カスタムフィルタ (プレイブックで定義):
{{ complex_data | to_nice_json }}
4. 空白の制御:
{% for item in fruits -%}
{{ item }}
{%- if not loop.last %}, {% endif %}
{%- endfor %}
5. 生のブロック (処理なし):
{% raw %}
This {{ will_not_be_processed }}
{% endraw %}
6. 別のテンプレートをインクルード:
{% include'simple_include.j2' %}
次に、簡単なインクルードファイルを作成します。simple_include.j2
という名前の新しいファイルを作成します。
nano simple_include.j2
次の内容を追加します。
This is content from an included template.
Current user: {{ ansible_user_id }}
次に、この高度なテンプレートを使用するためのプレイブックを作成します。プロジェクトのルートに戻り、use_advanced.yml
という名前の新しいファイルを作成します。
cd ~/project
nano use_advanced.yml
次の内容を追加します。
---
- name: Use advanced Jinja2 techniques
hosts: localhost
vars:
name: "Ansible Expert"
fruits:
- apple
- banana
- cherry
vegetables:
- carrot
- potato
- broccoli
complex_data:
key1: value1
key2:
- item1
- item2
custom_filters:
to_nice_json: "{{ '(' ~ ((complex_data | to_json) | replace('\"', '\\\"')) ~ ')' | from_json | to_nice_json }}"
tasks:
- name: Create file from template
template:
src: templates/advanced.j2
dest: /tmp/advanced.txt
- name: Display file contents
command: cat /tmp/advanced.txt
register: file_contents
- name: Show file contents
debug:
var: file_contents.stdout_lines
このプレイブックは、マクロ、カスタムフィルタ、空白の制御、そして他のテンプレートのインクルードを含む、高度な Jinja2 の技法を示しています。
プレイブックを実行します。
ansible-playbook use_advanced.yml
出力には、これらの高度な Jinja2 の技法が実際にどのように機能するかが示されます。