Biblioteca Online : ¡La Suscripción ENI por 9,90 € el primer mes!, con el código PRIMER9. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Ansible
  3. Escritura de filtros Jinja y mecanismo de lookup
Extrait - Ansible Administre la configuración de sus servidores y el despliegue de sus aplicaciones
Extractos del libro
Ansible Administre la configuración de sus servidores y el despliegue de sus aplicaciones Volver a la página de compra del libro

Escritura de filtros Jinja y mecanismo de lookup

Objetivos del capítulo y requisitos

1. Contexto y requisitos

En este capítulo volverá a trabajar sobre la noción de filtros y, especialmente, los filtros por defecto de Ansible. También verá la escritura de filtros y su uso en la gestión de las contraseñas.

Finalmente, trabajará sobre otro tipo de plugin ansible: el mecanismo de lookup.

Estos dos tipos de plugin están escritos en Python y se ejecutan en la máquina que realiza las acciones Ansible. La diferencia reside en la manera de utilizarlos. El primero se aplica en las variables gracias a un filtro Jinja. El segundo se puede usar en la definición del contenido de variables, o también para definir los bucles (loop o instrucciones de tipo with_*).

2. Archivos descargables

Puede encontrar los ejemplos de los directorios inventarios y variables en el archivo comprimido capitulo-13.tar.gz que se encuentra en la página del libro en el sitio de Ediciones ENI.

Los filtros Jinja

1. De vuelta a los filtros Jinja

En el capítulo que introducía la noción de rol, descubrió los filtros Jinja. Se vio que se podían realizar algunas operaciones, como por ejemplo, conversiones de cadenas de caracteres (enteros, booleanos o decimales).

También se pueden utilizar para otras muchas operaciones:

  • Cálculo de las sumas de hash (md5, sha1, etc.).

  • Obtención del valor máximo o mínimo de una lista.

  • Ordenación de listas.

  • Etc.

Un aspecto importante con respecto a los filtros es que se ejecutan en la máquina Ansible. Cada filtro se ejecuta en el contexto asociado a la máquina en la que está trabajando.

2. Algunos ejemplos de uso de los filtros Jinja

Antes de ir más lejos y escribir sus propios filtros, verá en detalle algunos filtros que ya existen.

a. ¿Cómo comprobar un filtro?

Lo primero es poder comprobar fácilmente sus filtros. Para ello, usará el modo ad hoc de Ansible con el módulo debug.

Utilizará la opción -a msg seguida de la instrucción Jinja que quiera comprobar. De esta manera, si quiere comprobar la conversión de la cadena 112 en un número entero, tendrá que escribir la instrucción siguiente:

$ ansible -m debug -a msg="{{'123'|int}}" localhost 

Ansible le devolverá el resultado siguiente:

localhost | SUCCESS => { 
   "msg": "112" 
} 

b. Valor por defecto

Empiece por los filtros que ya ha visto y, especialmente, el valor por defecto. De esta manera la ejecución {{undefined|default(’default-value’)}} dará la cadena default-value.

c. Conversión de tipo simple

Se puede forzar la interpretación de una variable. Este tipo de operación se usará para, por ejemplo, convertir una variable de tipo texto en un formato que permita los cálculos. He aquí las conversiones simples:

  • Conversión en enteros con el filtro int

  • Conversión en números de coma flotante con float

  • Conversión en booleanos con bool

He aquí un ejemplo de uso con Ansible en modo ad hoc en el que convertirá la cadena 2 en un entero al que sumará 1:

$ ansible -m debug -a msg="{{'2'|int + 1}}" localhost 

He aquí...

Test de comparación de contraseñas  con grano de sal

Ya ha visto los filtros existentes. Estos deberían permitirle responder a un cierto número de situaciones. En el caso en que no hubiera encontrado en ellos solución a su problema, siempre podrá crear un filtro específico.

1. Algunos detalles sobre el almacenamiento  de las contraseñas

Un gran clásico de la administración de sistemas es la creación de usuarios. Estos usuarios pueden tener una contraseña asociada a su cuenta. Esas contraseñas presentan “granos de sal”.

Este término designa el hecho de añadir una secuencia aleatorio al principio de la contraseña y de utilizar esta secuencia suplementaria para generar la suma de hash.

¿Por qué se realiza esta operación? Por razones de seguridad. Los algoritmos de tipo md5 o sha1 son estables y generan la misma suma para cada cadena. Esta propiedad permite, por otro lado, hacer la firma de los archivos.

El problema de esta estabilidad es que, gracias al uso de tablas de correspondencia inversa llamadas rainbow tables, se podrían obtener las contraseñas.

Una manera simple de convencerse es tomar la suma md5 de la cadena test (098f6bcd4621d373cade4e832627b4f6) y ponerla en el motor de búsqueda de Google. Se dará cuenta rápidamente de que esta suma ya ha sido realizada y de que encontrará rápidamente la secuencia original (en este caso, test).

El hecho de añadir un valor aleatorio además de la contraseña en la entrada del algoritmo, le protege de este tipo de ataque. Fíjese que, para distinguir el algoritmo de origen de la versión con el grano de sal, el algoritmo lleva como prefijo una ‘s’ (de sal). De esta manera, md5 con grano de sal se convierte en smd5, sha1 en ssha1, etc.

2. Reentrada en una contraseña

Eso ha sido la teoría. Ahora verá la práctica con un caso concreto: hay un usuario admin al que usted quiere gestionar la contraseña en la máquina. Para ello, puede usar el módulo user con los campos siguientes:

  • Campo name para especificar el nombre del usuario (admin).

  • Campo password donde pondrá la contraseña cifrada gracias al filtro password_hash.

 En este caso, trabajará sobre la máquina localhost y hará...

Generación de contraseña

1. Origen de la necesidad

En las siguientes líneas, abordará una técnica que le permitirá generar contraseñas. Estas contraseñas respetarán las condiciones siguientes:

  • Tener más de 12 caracteres.

  • Contener cifras, mayúsculas y algunos signos de puntuación.

  • Cambiar cada mes.

Si tiene que cambiar la contraseña cada mes, debería modificar el inventario. Para evitar esto, debe abordar la técnica de generación de contraseñas pseudo-aleatorias.

Estas deben responder a algunos criterios:

  • No cambiar entre dos ejecuciones de Ansible.

  • Ser diferentes de una plataforma a otra.

  • Responder a los criterios de seguridad.

2. Principio de funcionamiento del generador  de contraseñas

Es posible elegir una contraseña pseudo-aleatorio y hacer que esta no cambie. Para ello tiene que apoyarse en un grano de sal idéntico entre dos ejecuciones.

Sin embargo, el grano debe cambiar cada mes. Usará estos dos elementos:

  • el nombre de la máquina (inventory_hostname);

  • la fecha del mes(’%m’|strftime).

a. Escritura del generador de contraseñas

 Partiendo de este grano de sal, procederá a una generación aleatoria de 12 caracteres. La inicialización del generador de contraseñas se hace con la función seed de la biblioteca random de Python.

 Para definir el conjunto...

Obtención de información (lookup/query)

1. Principio de funcionamiento

Ya ha visto cómo funcionan los filtros Jinja y cómo usarlos en Ansible. Ahora verá cómo realizar llamadas de tipo lookup/query. Después abordará la escritura de sus propios lookups.

La diferencia de comportamiento entre las instrucciones lookup y query se hace en lo que respecta al resultado:

  • La instrucción lookup muestra cadenas de caracteres.

  • La instrucción query envía estructuras (tablas, estructuras JSON, etc.).

En el caso de un bucle(loop), use más bien la instrucción query.

La instrucción query se puede reemplazar por el atajo q.

2. Presentación de los lookups nativos de Ansible

a. Lectura de los archivos: file

El lookup file es bastante simple. Sirve para leer el contenido de un archivo y enviarlo como una cadena de caracteres. La llamada Jinja se hace de la manera siguiente:

lookup('file', 'nombre-archivo') 

Contemple el caso del archivo test-lookup-pass.txt con el contenido siguiente: 

Contenido del archivo test-lookup-file.txt 

La visualización del contenido del archivo con Ansible en modo ad hoc se hace gracias a la instrucción siguiente:

$ ansible -m debug \ 
  -a msg="{{ lookup('file', 'test-lookup-file.txt') }}" localhost 

He aquí el resultado:

localhost | SUCCESS => { ...

Escribir su propio lookup: KeePass

1. Contexto

Ya vio cómo usar con Ansible el resultado de un plugin de lookup en un bucle. Desgraciadamente, no encontrará siempre una solución llave en mano para ser usada y quizás tendrá que crear usted mismo esta solución.

Tomará el ejemplo siguiente: obtener datos del programa KeePassX en Linux.

2. Dependencia Python

Antes de continuar tendrá que instalar la biblioteca pykeepass. Esta instalación se hará con el comando siguiente:

$ pip3 install pykeepass 

3. Obtención de la contraseña

La obtención de la contraseña se hará en dos etapas:

  • Apertura de la base de datos KeePass.

  • Búsqueda y envío de la contraseña.

Para ello, necesitará el objeto PyKeePass de la biblioteca pykeepass. He aquí la instrucción que corresponda a esta importación:

from pykeepass import PyKeePass 

La apertura de la base KeePass se hace con la instrucción PyKeePass(nombre_archivo, password=contraseña). El objeto enviado será asignado a la variable db.

La búsqueda de la entrada correspondiente al usuario se hará usando el método find_entries_by_username con el parámetro del nombre del usuario buscado.

Para facilitar la puesta a punto y la legibilidad, el programa usará el método get_passwords. Esta función tomará como parámetros los siguientes datos: 

  • la ubicación del archivo de la base de datos KeePass;

  • la contraseña de la base de datos;

  • el nombre del usuario buscado.

Esta opción enviará una tabla con, para cada cadena encontrada, una pareja clave/valor constituida por el nombre de usuario y la contraseña asociada.

He aquí la implementación del método get_passwords correspondiente...