Técnicas avanzadas de Jinja2
En este último paso, exploraremos algunas técnicas avanzadas de Jinja2, incluyendo macros y filtros. Las macros son fragmentos de plantilla reutilizables, similares a las funciones en los lenguajes de programación.
Crea un nuevo archivo de plantilla llamado advanced.j2
:
cd ~/project/templates
nano advanced.j2
Agrega el siguiente contenido:
{% 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' %}
Ahora, creemos el archivo de inclusión simple. Crea un nuevo archivo llamado simple_include.j2
:
nano simple_include.j2
Agrega el siguiente contenido:
This is content from an included template.
Current user: {{ ansible_user_id }}
Ahora, creemos un playbook para usar esta plantilla avanzada. Regresa a la raíz del proyecto y crea un nuevo archivo llamado use_advanced.yml
:
cd ~/project
nano use_advanced.yml
Agrega el siguiente contenido:
---
- 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
Este playbook demuestra técnicas avanzadas de Jinja2, incluyendo macros, filtros personalizados, control de espacios en blanco e inclusión de otras plantillas.
Ejecuta el playbook:
ansible-playbook use_advanced.yml
La salida te mostrará cómo funcionan estas técnicas avanzadas de Jinja2 en la práctica.