Fortgeschrittene Jinja2-Techniken
In diesem letzten Schritt werden wir einige fortgeschrittene Jinja2-Techniken erkunden, einschließlich Makros und Filtern. Makros sind wiederverwendbare Vorlagenschnipsel, ähnlich wie Funktionen in Programmiersprachen.
Erstellen Sie eine neue Vorlagendatei mit dem Namen advanced.j2
:
cd ~/project/templates
nano advanced.j2
Fügen Sie den folgenden Inhalt hinzu:
{% macro render_list(title, items) %}
{{ title }}:
{% for item in items %}
- {{ item }}
{% endfor %}
{% endmacro %}
1. Using a macro:
{{ render_list("Fruits", fruits) }}
{{ render_list("Vegetables", vegetables) }}
2. Using set:
{% set greeting = "Hello, " + name + "!" %}
{{ greeting }}
3. Custom filter (defined in playbook):
{{ complex_data | to_nice_json }}
4. Whitespace control:
{% for item in fruits -%}
{{ item }}
{%- if not loop.last %}, {% endif %}
{%- endfor %}
5. Raw block (no processing):
{% raw %}
This {{ will_not_be_processed }}
{% endraw %}
6. Include another template:
{% include 'simple_include.j2' %}
Jetzt erstellen wir die einfache Einbeziehung-Datei. Erstellen Sie eine neue Datei mit dem Namen simple_include.j2
:
nano simple_include.j2
Fügen Sie den folgenden Inhalt hinzu:
This is content from an included template.
Current user: {{ ansible_user_id }}
Jetzt erstellen wir ein Playbook, um diese fortgeschrittene Vorlage zu verwenden. Gehen Sie zurück in das Projektstammverzeichnis und erstellen Sie eine neue Datei mit dem Namen use_advanced.yml
:
cd ~/project
nano use_advanced.yml
Fügen Sie den folgenden Inhalt hinzu:
---
- 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
Dieses Playbook demonstriert fortgeschrittene Jinja2-Techniken, einschließlich Makros, benutzerdefinierten Filtern, Leerzeichenkontrolle und Einbeziehung anderer Vorlagen.
Führen Sie das Playbook aus:
ansible-playbook use_advanced.yml
Die Ausgabe zeigt Ihnen, wie diese fortgeschrittenen Jinja2-Techniken in der Praxis funktionieren.