Cómo usar el módulo de plantilla Ansible

Cómo usar el módulo de plantilla Ansible
El ansible plantilla El módulo se usa principalmente para copiar archivos del cliente Ansible (donde se instala Ansible) a los hosts Ansible (administrado por Ansible). El beneficio de usar el plantilla módulo, en lugar del Copiar módulo, es que el ansible plantilla El módulo puede usar el lenguaje de plantilla Jinja2. Jinja2 es un poderoso lenguaje de plantilla de Python a través del cual puede generar archivos de configuración, páginas web, etc. También puede usar variables, bucles y condiciones de hechos ansibles en sus plantillas Jinja2.

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.yaml

Luego, escriba las siguientes líneas en el copy_file_template1.yaml libro de jugadas.

- Anfitriones: todos
Usuario: Ansible
tareas:
- Nombre: Índice de copia.archivo html al servidor
plantilla:
SRC: índice.jinja2
Dest:/Home/Ansible/Index.html
Propietario: Ansible
Grupo: Ansible
Modo: 0644

Este 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:




Demostración de plantilla jinja2


Bienvenido a Linuxhint!



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.yaml

El 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.yaml

Como 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


% terminara si %

Aquí, he comprobado si ansible_distribution es Debian. Si es así, entonces imprima la cadena

Estás ejecutando Debian Linux

. De lo contrario, no lo imprima.

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.yaml

Como puede ver, en mi anfitrión remoto de Debian, el índice.html El archivo tiene la línea

Estás ejecutando Debian Linux

. Sin embargo, en mi host remoto de Centos, la línea no está presente. Entonces, el Jinja2 si la condición está funcionando.

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 %
Haz algo si la condición es verdadera
% demás %
Haz algo si la condición es falsa
% terminara si %

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


% demás %

No estás ejecutando Debian Linux


% terminara si %

Aquí, he comprobado si ansible_distribution es Debian. Si es así, entonces imprima la cadena

Estás ejecutando Debian Linux

. De lo contrario, imprima

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.yaml

Como puede ver, en mi anfitrión remoto de Debian, el índice.html El archivo tiene la línea

Estás ejecutando Debian Linux

. Pero en mi host remoto de Centos, el índice.html El archivo tiene la línea

No estás ejecutando Debian Linux

. Entonces, el Jinja2 if-else la condición está funcionando.

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 %
Haz algo si la condición1 es verdad
% Elif condición2 %
Haz algo si la condición2 es verdad
% Elif condición3 %
Haz algo si la condición3 es verdad

% elif condición %
Haz algo si la condición es verdad
% demás %
Haz algo si ninguna de las condiciones es verdad
% terminara si %

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


% elif ansible_distribution == "centos" %

Estás ejecutando Centos Linux


% demás %

Su sistema operativo no es compatible


% terminara si %

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.yaml

Como 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

en el índice.html archivo.

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.yaml

A continuación, agregue las siguientes líneas en el copy_file_template1.yaml Archivo del libro de jugadas:

Vars:
Menús:
- Hogar
- Productos
- Sobre nosotros
- Contáctenos

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.yaml

Como 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.yaml

A continuación, agregue las siguientes líneas en el copy_file_template1.yaml Archivo del libro de jugadas:

Vars:
Menús:
- Nombre: Inicio
Enlace: /Inicio
- Nombre: Productos
Enlace: /Productos
- Nombre: Acerca de nosotros
Enlace: /About-US
- Nombre: Contáctenos
Enlace: /Contact-US

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.jinja2

A 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.yaml

Como 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.