Búsqueda de sitios web

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


En esta Parte 7 de la serie Ansible, aprenderá cómo crear y utilizar plantillas en Ansible para crear configuraciones personalizadas en nodos administrados. Crear plantillas en Ansible es una forma fácil y amigable de enviar configuraciones personalizadas a nodos administrados que ejecutan diferentes sistemas con una edición mínima de los archivos del libro de estrategias.

¿Qué son las plantillas en Ansible?

Para tener una mejor idea de qué es una plantilla, consideremos a un gerente de TI que 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 modo 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 sus 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. Las plantillas son extremadamente útiles al crear archivos de configuración personalizados para múltiples servidores pero únicos para cada uno de ellos.

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

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

Configuración

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.

Para CentOS 7

Para Ubuntu 18.04

Entonces, creemos un libro de estrategias 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.

Ahora creemos 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 se sustituirán 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 recarguemos las páginas web para los servidores web CentOS 7 y Ubuntu.

Para CentOS 7

Para Ubuntu 18.04

Como puede ver, en cada servidor se muestra información diferente sobre el nombre de host y la familia del sistema operativo. ¡Y así de geniales son las plantillas de Jinja2!

FILTROS :

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

Ejemplo 1: hacer que las cadenas aparezcan en mayúsculas/minúsculas

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 al 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

Ejemplo 2: reemplazar una cadena por otra

Además, puedes reemplazar una cadena por otra.

Por ejemplo:

El título de la película es {{ movie_name }} => 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 | reemplazar ("Ring", "Heist") }} => El título de la película es Heist.

Ejemplo 3: Listas y conjuntos de filtros

Para recuperar el valor más pequeño de una matriz, utilice el filtro min.

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

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

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

Para mostrar valores únicos, utilice 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

BUCLES :

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, utilice el bucle for como se muestra en el siguiente ejemplo:

Ejemplo 1:

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

También puedes combinar el bucle for con sentencias if-else para filtrar y obtener ciertos valores.

Ejemplo 2:

{% 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 siguiente tema donde nos aventuraremos a trabajar con variables y hechos ansibles.