Este artículo le mostrará cómo usar el Ansible plantilla Módulo y algunos conceptos básicos del lenguaje de plantilla Jinja2. Entonces empecemos!
Requisitos previos
Si desea probar los ejemplos en este artículo:
1) Debe tener Ansible instalado en su computadora.
2) Debe tener al menos un host de Ubuntu/Debian o un host CentOS/RHEL 8 configurado para la automatización Ansible.
Hay muchos artículos sobre Linuxhint dedicados a instalar Ansible y configurar hosts para Automatización Ansible. Puede consultarlos también, si es necesario.
Configuración de un directorio de proyectos Ansible
Antes de avanzar más, es una buena idea crear una estructura de directorio de proyectos, solo para mantener las cosas un poco organizadas.
Para crear un directorio de proyecto plantilla-demo/ y todos los subdirectorios requeridos (en su directorio de trabajo actual), ejecute el siguiente comando:
$ mkdir -pv plantilla -demo/playbooks/plantillas
Una vez que se crea el directorio del proyecto, navegue al directorio del proyecto, de la siguiente manera:
Plantilla de $ CD-Demo/
Crear un Hospedadores archivo de inventario, como sigue:
$ nano anfitriones
Luego, agregue el nombre de su host IP o DNS (VM1.notekita.comunicarse y VM2.notekita.comunicarse) en el archivo de inventario.
Una vez que haya terminado con este paso, guarde el archivo presionando + X, seguido por Y y .
Cree un archivo de configuración Ansible en el directorio del proyecto, como sigue:
$ nano ansible.CFG
Luego, escriba las siguientes líneas en el ansible.CFG archivo.
Una vez que haya terminado este paso, guarde el archivo presionando + X, seguido por Y y .
En este punto, el directorio del proyecto debe verse de la siguiente manera:
$ árbol
Como puede ver, los hosts ansibles también son accesibles. Entonces, podemos pasar a la siguiente sección de este artículo.
$ ansible all -u ansible -m ping
Conceptos básicos del módulo de plantilla Ansible
El plantilla El módulo de Ansible acepta las mismas opciones que el Copiar Módulo de Ansible.
Ansible común plantilla Opciones de módulo:
SRC - La ruta del archivo de plantilla Jinja2 en su computadora, que será analizado por el lenguaje de plantilla Jinja2 y copiado a los hosts remotos.
desestimado - La ruta de destino en los hosts remotos a los que se copiará el archivo.
dueño - El propietario del archivo en los hosts remotos.
grupo - El grupo del archivo en los hosts remotos.
modo - El modo de permiso de archivo en los hosts remotos.
Veamos un ejemplo.
Primero, cree un nuevo libro de jugadas Ansible copy_file_template1.yaml en el Libros de jugadas/ Directorio, como sigue:
$ Nano Playbooks/Copy_File_Template1.yamlLuego, escriba las siguientes líneas en el copy_file_template1.yaml libro de jugadas.
- Anfitriones: todosEste libro de jugadas copiará el índice.jinja2 archivo del Libros de jugadas/plantillas/ Directorio (en relación con su directorio de proyecto) a los hosts remotos utilizando el Ansible plantilla módulo.
Una vez que haya terminado con este paso, guarde el archivo presionando + X, seguido por Y y .
Crear el índice.jinja2 plantilla de archivo en el Libros de jugadas/plantillas Directorio, como sigue:
$ Nano Playbooks/plantillas/índice.jinja2
Escriba las siguientes líneas en el índice.jinja2 Archivo de plantilla:
Este es solo un archivo HTML simple. No usé ninguna sintaxis de jinja2 elegante aquí.
Una vez que haya terminado con este paso, guarde el archivo presionando + X, seguido por Y y .
Ejecutar el libro de jugadas copy_file_template1.yaml como sigue:
$ Ansible-Playbook Playbooks/Copy_file_template1.yamlEl libro de jugadas debe funcionar con éxito.
Como puedes ver, el índice.jinja2 La plantilla se renderizó utilizando el lenguaje de plantilla Jinja2. El contenido renderizado debe copiarse al índice.html Archivo de los hosts remotos.
Variables de impresión en la plantilla Jinja2
Puede usar hechos, variables y variables definidas por el usuario en sus plantillas Jinja2.
En su plantilla Jinja2, puede imprimir el valor de una variable utilizando el nombre de la variable sintaxis. Si la variable es un objeto, puede imprimir propiedades de objetos individuales utilizando el ObjectVariable.nombre de la propiedad sintaxis.
En el ejemplo que sigue, imprimiremos el fecha propiedad del ansible_date_time objeto en nuestro índice.jinja2 plantilla.
$ ansible all -u ansible -m setup | Egrep -Color 'Fecha | Hora'
Primero, abra el índice.jinja2 Archivo de plantilla con el editor de texto Nano, como sigue:
$ Nano Playbooks/plantillas/índice.jinja2
Agregue la siguiente línea al índice.jinja2 Archivo de plantilla:
Página generada en ansible_date_time.fecha
El final índice.jinja2 El archivo debe verse como se muestra en la captura de pantalla a continuación.
Una vez que haya terminado con este paso, guarde el archivo presionando + X, seguido por Y y .
Ejecutar el libro de jugadas copy_file_template1.yaml como sigue:
$ Ansible-Playbook Playbooks/Copy_file_template1.yamlComo puedes ver, el índice.jinja2 La plantilla fue procesada por el lenguaje de plantilla Jinja2 y reemplazó el ansible_date_time.fecha variable con la fecha en Yyyy-mm-dd formato. La salida se copió luego al índice.html Archivo en el host remoto.
Declaración if condicional en la plantilla Jinja2
El lenguaje de plantilla Jinja2 admite condicional si declaraciones. Puede verificar ciertas variables antes de imprimir cualquier cosa usando el si declaración.
El jinja2 si La sintaxis es la siguiente:
% If condición %
Haz algo si la condición es verdadera
% terminara si %
Veamos un ejemplo de Jinja2 si declaración.
En esta sección, demostraré el Jinja2 si declaración utilizando el ansible_distribution Variable de hechos.
$ ansible all -u ansible -m setup | Egrep -Color 'Dist'
Primero, abra el índice.jinja2 Plantilla Jinja2 con el editor de texto Nano, como sigue:
$ Nano Playbooks/plantillas/índice.jinja2
A continuación, agregue las siguientes líneas en el índice.jinja2 Archivo de plantilla:
% if ansible_distribution == "Debian" %Estás ejecutando Debian Linux
Aquí, he comprobado si ansible_distribution es Debian. Si es así, entonces imprima la cadena Estás ejecutando Debian Linux
Finalmente, el índice.jinja2 El archivo de plantilla debe verse como se muestra en la captura de pantalla a continuación.
Una vez que haya editado el archivo, guarde el archivo presionando + X, seguido por Y y .
Ahora, ejecute el libro de jugadas copy_file_template1.yaml como sigue:
$ Ansible-Playbook Playbooks/Copy_file_template1.yamlComo puede ver, en mi anfitrión remoto de Debian, el índice.html El archivo tiene la línea Estás ejecutando Debian Linux
Condicional: declaración if-else en la plantilla Jinja2
El lenguaje de plantilla Jinja2 admite condicional if-else declaraciones. Puede imprimir una cosa si la condición coincide e imprimir algo más si no usa el if-else declaración.
El jinja2 if-else La sintaxis es la siguiente:
% If condición %Veamos un ejemplo de Jinja2 if-else declaración.
Primero, abra el índice.jinja2 Plantilla Jinja2 con el editor de texto Nano, como sigue:
$ Nano Playbooks/plantillas/índice.jinja2
A continuación, agregue las siguientes líneas en el índice.jinja2 Archivo de plantilla:
% if ansible_distribution == "Debian" %Estás ejecutando Debian Linux
No estás ejecutando Debian Linux
Aquí, he comprobado si ansible_distribution es Debian. Si es así, entonces imprima la cadena Estás ejecutando Debian Linux No estás ejecutando Debian Linux
Finalmente, el índice.jinja2 El archivo de plantilla debe verse como se muestra en la captura de pantalla a continuación.
Una vez que haya editado el archivo, guarde el archivo presionando + X, seguido por Y y .
Ejecutar el libro de jugadas copy_file_template1.yaml como sigue:
$ Ansible-Playbook Playbooks/Copy_file_template1.yamlComo puede ver, en mi anfitrión remoto de Debian, el índice.html El archivo tiene la línea Estás ejecutando Debian Linux No estás ejecutando Debian Linux
Condicional: instrucción if-elif en la plantilla Jinja2
El lenguaje de plantilla Jinja2 admite condicional if-elif declaraciones.
El jinja2 if-elif La sintaxis es la siguiente:
% si condición1 %Aquí el % demás % La sección es opcional, pero está ahí si la necesita.
Veamos un ejemplo de Jinja2 if-elif declaración.
Primero, abra el índice.jinja2 Plantilla Jinja2 con el editor de texto Nano, como sigue:
$ Nano Playbooks/plantillas/índice.jinja2
A continuación, agregue las siguientes líneas en el índice.jinja2 Archivo de plantilla:
% if ansible_distribution == "Debian" %Estás ejecutando Debian Linux
Estás ejecutando Centos Linux
Su sistema operativo no es compatible
Aquí, he comprobado si ansible_distribution es Debian. Si es así, entonces imprima la cadena Estás ejecutando Debian Linux
También he comprobado si ansible_distribution es Cento. Si es así, entonces imprima la cadena Estás ejecutando Centos Linux
De lo contrario, imprima Su sistema operativo no es compatible
Finalmente, el índice.jinja2 El archivo de plantilla debe verse como se muestra en la captura de pantalla a continuación.
Una vez que haya editado el archivo, guarde el archivo presionando + X, seguido por Y y .
Ejecutar el libro de jugadas copy_file_template1.yaml como sigue:
$ Ansible-Playbook Playbooks/Copy_file_template1.yamlComo puede ver, en mi anfitrión remoto de Debian, el índice.html El archivo tiene la línea Estás ejecutando Debian Linux
En mi host remoto de Centos, el índice.html El archivo tiene la línea Estás ejecutando Centos Linux
Si tuviera otro host remoto que ejecuta un sistema operativo que no sea Debian o Centos, tendría la línea Su sistema operativo no es compatible
Entonces, el Jinja2 if-elif la condición está funcionando.
Bucles en la plantilla Jinja2
También puede imprimir matrices y objetos usando bucles en Jinja2.
El jinja2 para La sintaxis del bucle es la siguiente:
% para VariAblename en ArrayName %
Haz algo con VariAblename
% endfor %
Aquí, en cada iteración de la matriz nombre del nombre, Uno de los elementos de la matriz (a partir del comienzo de la matriz) se asigna a la nombre de la variable variable. Puedes hacer algo con esta variable dentro del bucle.
Permítanos ver cómo puede imprimir elementos de matriz en su plantilla Jinja2 en el siguiente ejemplo.
Primero, abra el copy_file_template1.yaml Ansible Playbook con el editor de texto Nano, como sigue:
$ Nano Playbooks/Copy_File_Template1.yamlA continuación, agregue las siguientes líneas en el copy_file_template1.yaml Archivo del libro de jugadas:
Vars:Aquí, he agregado un menús matriz en el copy_file_template1.yaml libro de jugadas. A continuación, imprimiré los elementos de la matriz usando un bucle en mi índice.jinja2 Archivo de plantilla jinja2.
Finalmente, el copy_file_template1.yaml El archivo del libro de jugadas debe verse como se muestra en la captura de pantalla a continuación.
Una vez que haya editado el archivo, guarde el archivo presionando + X, seguido por Y y .
Ahora, abra el índice.jinja2 Plantilla Jinja2 con el editor de texto Nano, como sigue:
$ Nano Playbooks/plantillas/índice.jinja2
Agregue las siguientes líneas en el índice.jinja2 Archivo de plantilla:
Aquí, estoy generando una barra de navegación HTML simple usando un Jinja2 para bucle. El bucle itera a través del menús Array (que he definido en el copy_file_template1.libro de jugadas yaml elementos y genera un menú Artículo en cada iteración.
Finalmente, el índice.jinja2 El archivo de plantilla debe verse como se muestra en la captura de pantalla a continuación.
Una vez que haya editado el archivo, guarde el archivo presionando + X, seguido por Y y .
Ejecutar el libro de jugadas copy_file_template1.yaml como sigue:
$ Ansible-Playbook Playbooks/Copy_file_template1.yamlComo puede ver, el Jinja2 para bucle generó una barra de navegación HTML (en el índice.html archivo).
También puede acceder a una variedad de objetos en su plantilla Jinja2.
Veamos otro ejemplo.
Primero, abra el copy_file_template1.yaml Ansible Playbook con el editor de texto Nano, como sigue:
$ Nano Playbooks/Copy_File_Template1.yamlA continuación, agregue las siguientes líneas en el copy_file_template1.yaml Archivo del libro de jugadas:
Vars:Aquí, he agregado un menús matriz de objetos en el copy_file_template1.yaml libro de jugadas. Cada uno de estos objetos tiene dos propiedades, un nombre propiedad y un enlace propiedad.
Finalmente, el copy_file_template1.yaml El archivo del libro de jugadas debe verse como se muestra en la captura de pantalla a continuación.
Una vez que haya editado el archivo, guarde el archivo presionando + X, seguido por Y y .
Abre el índice.jinja2 Plantilla Jinja2 con el editor de texto Nano, como sigue:
$ Nano Playbooks/plantillas/índice.jinja2A continuación, agregue las siguientes líneas en el índice.jinja2 Archivo de plantilla:
Todo lo que ves aquí es lo mismo que en el ejemplo anterior. La única diferencia es que estoy imprimiendo las propiedades del objeto nombre (usando menú.nombre) y enlace (usando menú.enlace) en mi índice.jinja2 Plantilla Jinja2.
Finalmente, el índice.jinja2 El archivo de plantilla debe verse como se muestra en la captura de pantalla a continuación.
Una vez que haya editado el archivo, guarde el archivo presionando + X, seguido por Y y .
Ahora, ejecute el libro de jugadas copy_file_template1.yaml como sigue:
$ Ansible-Playbook Playbooks/Copy_file_template1.yamlComo puede ver, el Jinja2 para bucle generó una barra de navegación HTML (en el índice.html Archivo) desde una matriz de objetos.
Que sigue?
En este artículo, le he mostrado cómo usar el Ansible plantilla módulo y describió algunos de los conceptos básicos del lenguaje de plantilla Jinja2. Visite el sitio web oficial de Jinja2 para obtener más información sobre el lenguaje de plantilla Jinja2.