Cómo crear plantillas en Ansible para crear configuraciones en nodos administrados - Parte 7


En esta parte 7 de la serie Ansible, aprenderá a crear y usar plantillas en Ansible para crear configuraciones personalizadas en nodos administrados. La creación de plantillas en Ansible es una forma fácil y amigable de enviar configuraciones personalizadas a los nodos administrados que ejecutan diferentes sistemas con una edición mínima de los archivos del libro de jugadas.

Para tener una mejor idea de lo que es una plantilla, consideremos que un gerente de TI redacta un correo electrónico para invitar a su departamento a un cóctel. El correo electrónico se envía a cada uno de los miembros y también los invita a acompañar a sus cónyuges.

El correo electrónico se ha personalizado de manera que el cuerpo del correo electrónico sigue siendo el mismo, pero los destinatarios y los nombres de sus respectivos cónyuges varían. El correo electrónico se convierte en la plantilla, mientras que los destinatarios y los respectivos cónyuges son variables.

Ese fue un ejemplo genérico. Ansible utiliza Jinja2, que es un motor de plantillas moderno para marcos de Python que se utiliza para generar contenido o expresiones dinámicas. La creación de plantillas es extremadamente útil al crear archivos de configuración personalizados para varios servidores, pero únicos para cada uno de ellos.

Jinja2 usa las llaves dobles {{...}} para encerrar una variable que ha sido definida. Para comentarios, use {{# #} y para declaraciones condicionales use {%…%} .

Supongamos que tiene un modelo de datos de VLAN en su red con sistemas host que desea enviar a sus respectivas VLAN como se muestra.

vlans:
  - id: 10
    name: LB
  - id: 20
    name: WB_01
  - id: 30
    name: WB_02
  - id: 40
    name: DB

Para renderizar esta configuración, la plantilla jinja2 correspondiente llamada vlans.j2 aparecería como se muestra. Como puede ver, las variables vlan.id y vlan.name se han encerrado entre llaves.

vlan {{ vlan.id }}
  name {{ vlan.name }}

Poniéndolo todo junto en un libro de jugadas que coloca diferentes máquinas host, esto aparecería como se muestra:

    - hosts
  tasks:
    - name: Rendering VLAN configuration
      template:
         src: vlans.j2
         dest: "vlan_configs/{{ inventory_hostname }}.conf"

Ejemplo 1: configuración de servidores web en diferentes distribuciones

En este ejemplo, crearemos archivos index.html que mostrarán información sobre el nombre de host y el sistema operativo de 2 servidores web que ejecutan CentOS y Ubuntu.

Ubuntu 18 - IP address: 173.82.202.239
CentOS 7 -  IP address: 173.82.115.165

El servidor web Apache ya se ha instalado en ambos servidores.

Así que creemos un libro de jugadas test_server.yml como se muestra:

---

 - hosts: all
   become: yes

   tasks:

    - name: Install index.html
      template:
        src: index.html.j2
        dest: /var/www/html/index.html
        mode: 0777

Nuestra plantilla de archivo Jinja es index.html.j2 que se enviará al archivo index.html en cada servidor web. Recuerde siempre poner la extensión .j2 al final para indicar que es un archivo jinja2.

Creemos ahora el archivo de plantilla index.html.j2.

<html>
<center>
   <h1> The hostname of this webserver is {{ ansible_hostname }}</h1>
   <h3> It is running on {{ ansible_os_family}}system </h3>
</center>
</html>

Esta plantilla es un archivo HTML básico donde ansible_hostname y ansible_os_family son variables integradas que serán sustituidas por los respectivos nombres de host y sistemas operativos de los servidores web individuales en el navegador.

Ahora, ejecutemos el libro de jugadas.

# ansible-playbook test_server.yml

Ahora volvamos a cargar las páginas web para los servidores web CentOS 7 y Ubuntu.

Como puede ver, en cada servidor se muestra información diferente sobre el nombre de host y la familia de SO. ¡Y así de genial es la aplicación de plantillas Jinja2!

FILTROS:

A veces, puede decidir sustituir el valor de una variable con una cadena que aparece de cierta manera.

Por ejemplo, en el ejemplo anterior, podemos decidir hacer que las variables de Ansible aparezcan en mayúsculas. Para hacerlo, agregue el valor superior a la variable. De esta forma, el valor de la variable se convierte a formato de mayúsculas.

{{ ansible_hostname | upper }} => CENTOS 7
{{ ansible_os_family | upper }} => REDHAT

De manera similar, puede convertir la salida de la cadena a minúsculas agregando el argumento inferior.

{{ ansible_hostname | lower }}  => centos 7
{{ ansible_os_family | lower }} => redhat

Además, puede reemplazar una cadena por otra.

Por ejemplo:

El título de la película es {{movie_name}} u003d> El título de la película es Ring.

Para reemplazar la salida con otra cadena, use el argumento de reemplazo como se muestra:

El título de la película es {{movie_name | replace ("Ring", "Heist")}} u003d> El título de la película es Heist.

Para recuperar el valor más pequeño de una matriz, use el filtro mínimo.

{{ [ 2, 3, 4, 5, 6, 7 ] | min }}	=>	2

De manera similar, para recuperar el número más grande, use el filtro máximo.

{{ [ 2, 3, 4, 5, 6, 7 ] | max }}	=>	7

Para mostrar valores únicos, use el filtro único.

{{ [ 2, 3, 3, 2, 6, 7 ] | unique }} =>	2, 3

Utilice el filtro aleatorio para obtener un número aleatorio entre 0 y el valor.

{{ 50 | random }} =>  Some random number

LAZOS:

Al igual que en los lenguajes de programación, tenemos bucles en Ansible Jinja2.

Por ejemplo, para generar un archivo que contenga una lista de números, use el bucle for como se muestra en el siguiente ejemplo:

{% for number in [0, 1, 2, 3, 4, 5, 6, 7]  %}
{{ number }}
{% end for %}

También puede combinar el ciclo for con declaraciones if-else para filtrar y obtener ciertos valores.

{% for number in [0, 1, 2, 3, 4, 5, 6, 7]  %}
{% if number == 5 %}
         {{ number }}
{% endif%}
{% endfor %}

Y eso es todo por esta conferencia. Únase a nosotros en el próximo tema donde nos aventuraremos a trabajar con variables y hechos ansible.