Este artículo le mostrará cómo utilizar el módulo de plantilla de Ansible y algunos conceptos básicos del lenguaje de plantillas Jinja2. ¡Entonces empecemos!
Prerrequisitos
Si desea probar los ejemplos de este artículo:
1) Debe tener Ansible instalado en su computadora.
2) Debe tener al menos un host Ubuntu / Debian o un host CentOS / RHEL 8 configurado para la automatización de Ansible.
Hay muchos artículos sobre dedicados a la instalación de Ansible y la configuración de hosts para la automatización de Ansible. También puede consultarlos, si es necesario.
Configuración de un directorio de proyectos Ansible
Antes de continuar, es una buena idea crear una estructura de directorio de proyecto, solo para mantener las cosas un poco organizadas.
Para crear un directorio de proyecto template-demo / y todos los subdirectorios necesarios (en su directorio de trabajo actual), ejecute el siguiente comando:
Una vez que se crea el directorio del proyecto, navegue hasta el directorio del proyecto, de la siguiente manera:
Cree un archivo de inventario de hosts , de la siguiente manera:
Luego, agregue su IP de host o nombre DNS ( vm1.nodekite.com y vm2.nodekite.com ) en el archivo de inventario.
Una vez que haya terminado con este paso, guarde el archivo presionando <Ctrl> + X , seguido de Y e <Enter> .
Cree un archivo de configuración de Ansible en el directorio del proyecto, de la siguiente manera:
Luego, escriba las siguientes líneas en el archivo ansible.cfg .
Una vez que haya terminado este paso, guarde el archivo presionando <Ctrl> + X , seguido de Y e <Enter> .
En este punto, el directorio del proyecto debería tener el siguiente aspecto:
Como puede ver, los hosts de Ansible también son accesibles. Entonces, podemos pasar a la siguiente sección de este artículo.
Conceptos básicos del módulo de plantilla de Ansible
El módulo de plantilla de Ansible acepta las mismas opciones que el módulo de copia de Ansible.
Opciones comunes del módulo de plantilla de Ansible :
src : la ruta del archivo de plantilla Jinja2 en su computadora, que será analizado por el lenguaje de plantillas Jinja2 y copiado en los hosts remotos.
dest : la ruta de destino en los hosts remotos en los que se copiará el archivo.
propietario : el propietario del archivo en los hosts remotos.
grupo : el grupo del archivo en los hosts remotos.
mode : el modo de permiso de archivo en los hosts remotos.
Veamos un ejemplo.
Primero, cree un nuevo libro de jugadas de Ansible copy_file_template1.yaml en el directorio playbooks / , de la siguiente manera:
Luego, escriba las siguientes líneas en el libro de jugadas copy_file_template1.yaml .
user: ansible
tasks:
– name: Copy index.html file to server
template:
src: index.jinja2
dest: /home/ansible/index.html
owner: ansible
group: ansible
mode: 0644
Este manual copiará el archivo index.jinja2 del directorio playbooks / templates / (relativo al directorio de su proyecto) a los hosts remotos usando el módulo de plantilla Ansible .
Una vez que haya terminado con este paso, guarde el archivo presionando <Ctrl> + X , seguido de Y e <Enter> .
Cree el archivo de plantilla index.jinja2 en el directorio playbooks / templates , de la siguiente manera:
Escriba las siguientes líneas en el archivo de plantilla index.jinja2 :
Este es solo un archivo HTML simple. No utilicé ninguna sintaxis elegante de Jinja2 aquí.
Una vez que haya terminado con este paso, guarde el archivo presionando <Ctrl> + X , seguido de Y e <Enter> .
Ejecute el libro de jugadas copy_file_template1.yaml de la siguiente manera:
El libro de jugadas debería ejecutarse correctamente.
Como puede ver, la plantilla index.jinja2 se renderizó utilizando el lenguaje de plantillas Jinja2. El contenido renderizado debe copiarse en el archivo index.html de los hosts remotos.
Impresión de variables en la plantilla Jinja2
Puede utilizar hechos, variables y variables definidas por el usuario de Ansible en sus plantillas Jinja2.
En su plantilla Jinja2, puede imprimir el valor de una variable usando la sintaxis {{variableName}} . Si la variable es un objeto, puede imprimir propiedades de objetos individuales usando la sintaxis {{objectVariable.propertyName}} .
En el siguiente ejemplo, imprimiremos la propiedad de fecha del objeto ansible_date_time en nuestra plantilla index.jinja2 .
Primero, abra el archivo de plantilla index.jinja2 con el editor de texto nano, de la siguiente manera:
Agregue la siguiente línea al archivo de plantilla index.jinja2 :
El archivo index.jinja2 final debería verse como se muestra en la captura de pantalla a continuación.
Una vez que haya terminado con este paso, guarde el archivo presionando <Ctrl> + X , seguido de Y e <Enter> .
Ejecute el libro de jugadas copy_file_template1.yaml de la siguiente manera:
Como puede ver, la plantilla index.jinja2 fue procesada por el lenguaje de plantillas Jinja2 y reemplazó la variable {{ansible_date_time.date}} con la fecha en formato AAAA-MM-DD . Luego, la salida se copió al archivo index.html en el host remoto.
Declaración if condicional en la plantilla Jinja2
El lenguaje de plantillas Jinja2 admite declaraciones if condicionales . Puede verificar ciertas variables antes de imprimir cualquier cosa usando la declaración if .
La sintaxis de Jinja2 if es la siguiente:
Do something if the condition is true
{% endif %}
Veamos un ejemplo de la declaración if de Jinja2 .
En esta sección, demostraré la declaración if de Jinja2 utilizando la variable de hechos ansible_distribution .
Primero, abra la plantilla index.jinja2 Jinja2 con el editor de texto nano, de la siguiente manera:
A continuación, agregue las siguientes líneas en el archivo de plantilla index.jinja2 :
<p>You’re running Debian Linux</p>
{% endif %}
Aquí, he comprobado si ansible_distribution es Debian . Si es así, imprima la cadena <p> Está ejecutando Debian Linux </p> . De lo contrario, no lo imprima.
Finalmente, el archivo de plantilla index.jinja2 debería verse como se muestra en la captura de pantalla a continuación.
Una vez que haya editado el archivo, guárdelo presionando <Ctrl> + X , seguido de Y e <Enter> .
Ahora, ejecute el libro de jugadas copy_file_template1.yaml de la siguiente manera:
Como puede ver, en mi host remoto Debian, el archivo index.html tiene la línea <p> Está ejecutando Debian Linux </p> . Sin embargo, en mi host remoto CentOS, la línea no está presente. Entonces, la condición Jinja2 if está funcionando.
Condicional: declaración if-else en la plantilla Jinja2
El lenguaje de plantillas Jinja2 admite declaraciones condicionales if-else . Puede imprimir una cosa si la condición coincide e imprimir otra cosa si no lo hace usando la instrucción if-else .
La sintaxis if-else de Jinja2 es la siguiente:
Do something if the condition is true
{% else %}
Do something if the condition is false
{% endif %}
Veamos un ejemplo de la declaración if-else de Jinja2 .
Primero, abra la plantilla index.jinja2 Jinja2 con el editor de texto nano, de la siguiente manera:
A continuación, agregue las siguientes líneas en el archivo de plantilla index.jinja2 :
<p>You’re running Debian Linux</p>
{% else %}
<p>You’re not running Debian Linux</p>
{% endif %}
Aquí, he comprobado si ansible_distribution es Debian . Si es así, imprima la cadena <p> Está ejecutando Debian Linux </p> . De lo contrario, imprima <p> No está ejecutando Debian Linux </p> .
Finalmente, el archivo de plantilla index.jinja2 debería verse como se muestra en la captura de pantalla a continuación.
Una vez que haya editado el archivo, guárdelo presionando <Ctrl> + X , seguido de Y e <Enter> .
Ejecute el libro de jugadas copy_file_template1.yaml de la siguiente manera:
Como puede ver, en mi host remoto Debian, el archivo index.html tiene la línea <p> Está ejecutando Debian Linux </p> . Pero en mi host remoto CentOS, el archivo index.html tiene la línea <p> No está ejecutando Debian Linux </p> . Entonces, la condición if-else de Jinja2 está funcionando.
Condicional: declaración if-elif en la plantilla Jinja2
El lenguaje de plantillas Jinja2 admite declaraciones condicionales if-elif .
La sintaxis if-elif de Jinja2 es la siguiente:
Do something if the condition1 is true
{% elif condition2 %}
Do something if the condition2 is true
{% elif condition3 %}
Do something if the condition3 is true
…
{% elif conditionN %}
Do something if the conditionN is true
{% else %}
Do something if none of the conditions are true
{% endif %}
Aquí, la sección {% else%} es opcional, pero está ahí si la necesita.
Veamos un ejemplo de la declaración if-elif de Jinja2 .
Primero, abra la plantilla index.jinja2 Jinja2 con el editor de texto nano, de la siguiente manera:
A continuación, agregue las siguientes líneas en el archivo de plantilla index.jinja2 :
<p>You’re running Debian Linux</p>
{% elif ansible_distribution== “CentOS” %}
<p>You’re running CentOS Linux</p>
{% else %}
<p>Your Operating System is not supported</p>
{% endif %}
Aquí, he comprobado si ansible_distribution es Debian . Si es así, imprima la cadena <p> Está ejecutando Debian Linux </p> .
También he comprobado si ansible_distribution es CentOS . Si es así, imprima la cadena <p> Está ejecutando CentOS Linux </p> .
De lo contrario, imprima <p> Su sistema operativo no es compatible </p> .
Finalmente, el archivo de plantilla index.jinja2 debería verse como se muestra en la captura de pantalla a continuación.
Una vez que haya editado el archivo, guárdelo presionando <Ctrl> + X , seguido de Y e <Enter> .
Ejecute el libro de jugadas copy_file_template1.yaml de la siguiente manera:
Como puede ver, en mi host remoto Debian, el archivo index.html tiene la línea <p> Está ejecutando Debian Linux </p> .
En mi host remoto CentOS, el archivo index.html tiene la línea <p> Estás ejecutando CentOS Linux </p> .
Si tuviera otro host remoto que ejecute un sistema operativo que no sea Debian o CentOS, tendría la línea <p> Su sistema operativo no es compatible </p> en el archivo index.html .
Entonces, la condición if-elif de Jinja2 está funcionando.
Bucles en la plantilla Jinja2
También puede imprimir matrices y objetos usando bucles en Jinja2.
La sintaxis de bucle for Jinja2 es la siguiente:
Do something with variableName
{% endfor %}
Aquí, en cada iteración de la matriz arrayName , uno de los elementos de la matriz (comenzando desde el principio de la matriz) se asigna a la variable variableName. Puedes hacer algo con esta variable dentro del ciclo.
Veamos cómo puede imprimir elementos de matriz en su plantilla Jinja2 en el siguiente ejemplo.
Primero, abra el libro de jugadas copy_file_template1.yaml Ansible con el editor de texto nano, de la siguiente manera:
A continuación, agregue las siguientes líneas en el archivo de libro de jugadas copy_file_template1.yaml :
menus:
– Home
– Products
– About Us
– Contact Us
Aquí, he agregado una matriz de menús en el libro de jugadas copy_file_template1.yaml . A continuación, imprimiré los elementos de la matriz utilizando un bucle en mi archivo de plantilla index.jinja2 Jinja2.
Finalmente, el archivo copy_file_template1.yaml del libro de jugadas debería verse como se muestra en la captura de pantalla a continuación.
Una vez que haya editado el archivo, guárdelo presionando <Ctrl> + X , seguido de Y e <Enter> .
Ahora, abra la plantilla index.jinja2 Jinja2 con el editor de texto nano, de la siguiente manera:
Agregue las siguientes líneas en el archivo de plantilla index.jinja2 :
<ul>
{% for menu in menus %}
<li><a href=“#”>{{ menu }}</a></li>
{% endfor %}
</ul>
</nav>
Aquí, estoy generando una barra de navegación HTML simple usando un bucle for de Jinja2 . El ciclo itera a través de los elementos de la matriz de menús (que he definido en el libro de jugadas copy_file_template1.yaml) y genera un elemento de menú en cada iteración.
Finalmente, el archivo de plantilla index.jinja2 debería verse como se muestra en la captura de pantalla a continuación.
Una vez que haya editado el archivo, guárdelo presionando <Ctrl> + X , seguido de Y e <Enter> .
Ejecute el libro de jugadas copy_file_template1.yaml de la siguiente manera:
Como puede ver, el bucle for de Jinja2 generó una barra de navegación HTML (en el archivo index.html ).
También puede acceder a una variedad de objetos en su plantilla Jinja2.
Veamos otro ejemplo.
Primero, abra el libro de jugadas copy_file_template1.yaml Ansible con el editor de texto nano, de la siguiente manera:
A continuación, agregue las siguientes líneas en el archivo de libro de jugadas copy_file_template1.yaml :
menus:
– name: Home
link: /home
– name: Products
link: /products
– name: About Us
link: /about-us
– name: Contact Us
link: /contact-us
Aquí, he agregado una matriz de objetos de menús en el libro de jugadas copy_file_template1.yaml . Cada uno de estos objetos tiene dos propiedades, una propiedad de nombre y una propiedad de vínculo .
Finalmente, el archivo copy_file_template1.yaml del libro de jugadas debería verse como se muestra en la captura de pantalla a continuación.
Una vez que haya editado el archivo, guárdelo presionando <Ctrl> + X , seguido de Y e <Enter> .
Abra la plantilla index.jinja2 Jinja2 con el editor de texto nano, de la siguiente manera:
A continuación, agregue las siguientes líneas en el archivo de plantilla index.jinja2 :
<ul>
{% for menu in menus %}
<li><a href=“{{ menu.link }}”>{{ menu.name }}</a></li>
{% endfor %}
</ul>
</nav>
Todo lo que ves aquí es igual que en el ejemplo anterior. La única diferencia es que estoy imprimiendo el nombre de las propiedades del objeto (usando menu.name ) y el enlace (usando menu.link ) en mi plantilla index.jinja2 Jinja2.
Finalmente, el archivo de plantilla index.jinja2 debería verse como se muestra en la captura de pantalla a continuación.
Una vez que haya editado el archivo, guárdelo presionando <Ctrl> + X , seguido de Y e <Enter> .
Ahora, ejecute el libro de jugadas copy_file_template1.yaml de la siguiente manera:
Como puede ver, el bucle for de Jinja2 generó una barra de navegación HTML (en el archivo index.html ) a partir de una matriz de objetos.
¿Que sigue?
En este artículo, le he mostrado cómo utilizar el módulo de plantilla de Ansible y he descrito algunos de los conceptos básicos del lenguaje de plantillas Jinja2. Visite el sitio web oficial de Jinja2 para obtener más información sobre el lenguaje de plantillas de Jinja2.