ansible - tutorial - jinja2 declare variable
¿Cómo puedo probar las plantillas jinja2 en ansible? (2)
A veces necesito probar algunas plantillas jinja2 que uso en mis roles de ansible. ¿Cuál es la forma más sencilla de hacer esto?
Por ejemplo, tengo una plantilla (test.j2):
{% if users is defined and users %}
{% for user in users %}{{ user }}
{% endfor %}
{% endif %}
y vars (en group_vars / all):
---
users:
- Mike
- Smith
- Klara
- Alex
En este momento existen 4 variantes diferentes:
1_Online (utilizando https://cryptic-cliffs-32040.herokuapp.com/ )
Basado en el jinja2-live-parser .
2_Interactivo (usando python y library jinja2, PyYaml)
import yaml
from jinja2 import Template
>>> template = Template("""
... {% if users is defined and users %}
... {% for user in users %}{{ user }}
... {% endfor %}
... {% endif %}
... """)
>>> values = yaml.load("""
... ---
... users:
... - Mike
... - Smith
... - Klara
... - Alex
... """)
>>> print "{}".format(template.render(values))
Mike
Smith
Klara
Alex
3_Ansible (usando --check)
Crear prueba de libro de jugadas jinja2test.yml:
---
- hosts: 127.0.0.1
tasks:
- name: Test jinja2template
template: src=test.j2 dest=test.conf
y ejecutarlo:
ansible-playbook jinja2test.yml --check --diff --connection=local
salida de muestra:
PLAY [127.0.0.1] **************************************************************
GATHERING FACTS ***************************************************************
ok: [127.0.0.1]
TASK: [Test jinja2template] ***************************************************
--- before: test.conf
+++ after: /Users/user/ansible/test.j2
@@ -0,0 +1,4 @@
+Mike
+Smith
+Klara
+Alex
changed: [127.0.0.1]
PLAY RECAP ********************************************************************
127.0.0.1 : ok=2 changed=1 unreachable=0 failed=0
4_Ansible (usando la plantilla -m) gracias por @artburkart
Hacer un archivo llamado test.txt.j2
{% if users is defined and users %}
{% for user in users %}
{{ user }}
{% endfor %}
{% endif %}
Llama a ansible como tal:
ansible all -i "localhost," -c local -m template -a "src=test.txt.j2 dest=./test.txt" --extra-vars=''{"users": ["Mike", "Smith", "Klara", "Alex"]}''
test.txt
un archivo llamado test.txt
en el directorio actual, que contendrá la salida de la plantilla test.txt.j2
evaluada.
Entiendo que esto no usa directamente un archivo vars, pero creo que es la forma más sencilla de probar una plantilla sin usar dependencias externas. Además, creo que hay algunas diferencias entre lo que proporciona la biblioteca jinja2 y lo que proporciona ansible, por lo que usar ansible evita directamente cualquier discrepancia. Cuando el JSON que se alimenta a --extra-vars
satisface sus necesidades, puede convertirlo a YAML y seguir su camino.
Si tiene una plantilla jinja2 llamada test.j2
y un archivo vars ubicado en group_vars/all.yml
, puede probar la plantilla con el siguiente comando:
ansible all -i localhost, -c local -m template -a "src=test.j2 dest=./test.txt" --extra-vars=@group_vars/all.yml
Se generará un archivo llamado test.txt
en el directorio actual, que contendrá la salida de la plantilla test.j2
evaluada.
Creo que esta es la forma más sencilla de probar una plantilla sin utilizar dependencias externas. Además, hay diferencias entre lo que proporciona la biblioteca jinja2 y lo que proporciona ansible, por lo que usar ansible evita directamente cualquier discrepancia. También es posible probar variables ad-hoc sin crear un archivo vars adicional utilizando JSON:
ansible all -i "localhost," -c local -m template -a "src=test.j2 dest=./test.txt" --extra-vars=''{"users": ["Mike", "Smith", "Klara", "Alex"]}''