Cómo trabajar con variables y hechos de Ansible - Parte 8


Hemos mencionado variables en esta serie de Ansible y solo para refrescar un poco su mente. Una variable, al igual que en muchos lenguajes de programación, es esencialmente una clave que representa un valor.

¿Qué constituye un nombre de variable válido?

El nombre de una variable incluye letras, números, guiones bajos o una combinación de 2 o de todos. Sin embargo, tenga en cuenta que el nombre de una variable siempre debe comenzar con una letra y no debe contener espacios.

Echemos un vistazo a algunos ejemplos de nombres de variables válidos e inaceptables:

football 
foot_ball
football20 
foot_ball20
foot ball
20 
foot-ball

Analicemos los tipos de variables:

1. Variables del libro de jugadas

Las variables del libro de jugadas son bastante fáciles y directas. Para definir una variable en un libro de jugadas, simplemente use la palabra clave vars antes de escribir sus variables con sangría.

Para acceder al valor de la variable, colóquelo entre las llaves dobles entre comillas.

A continuación, se muestra un ejemplo de libro de jugadas simple:

- hosts: all
  vars:
    greeting: Hello world! 

  tasks:
  - name: Ansible Basic Variable Example
    debug:
      msg: "{{ greeting }}"

En el libro de jugadas anterior, la variable de saludo se sustituye por el valor ¡Hola, mundo! cuando se ejecuta el libro de jugadas. El libro de jugadas simplemente imprime el mensaje ¡Hola, mundo! cuando se ejecuta.

Además, puede tener una lista o una matriz de variables como se muestra:

El siguiente libro de jugadas muestra una variable llamada continentes. La variable tiene 5 valores diferentes: nombres de continentes. Se puede acceder fácilmente a cada uno de estos valores utilizando el índice 0 como primera variable.

El ejemplo del libro de jugadas a continuación recupera y muestra Asia (índice 1).

- hosts: all
  vars:
    continents:
      - Africa
      - Asia
      - South America
      - North America
      - Europe
      
  tasks:
  - name: Ansible List variable Example
    debug:
      msg: "{{ continents [1] }}"

La lista de variables se puede estructurar de manera similar como se muestra:

vars:
    Continents: [Africa, Asia, South America, North America, Europe]

Para enumerar todos los elementos de la lista, use el módulo with_items. Esto recorrerá todos los valores de la matriz.

- hosts: all
  vars:
    continents: [Africa, Asia, South America, North America, Europe]

  tasks:
  - name: Ansible array variables example
    debug: 
      msg: "{{ item }}"
    with_items:
      - "{{ continents }}"

Otro tipo de variable de Ansible es la variable de diccionario.

Las variables de diccionario también se admiten en el libro de jugadas. Para definir la variable del diccionario, simplemente identifique el par clave-valor justo debajo del nombre de la variable del diccionario.

hosts: switch_f01

vars:
   http_port: 8080
   default_gateway: 10.200.50.1
   vlans:
       id: 10
       port: 2

En el ejemplo anterior, vlans es la variable de diccionario, mientras que id y port son los pares clave-valor.

hosts: switch_f01

vars:
   http_port: 8080
   default_gateway: 
   vlans:
      id: 10
      port: 20

 tasks:
   name: Configure default gateway
   system_configs:
   default_gateway_ip: “{{ default_gateway  }}“


   name: Label port on vlan 10
   vlan_config:
	vlan_id: “{{ vlans[‘id’]  }}“
     port_id: 1/1/ {{ vlans[‘port’]  }}

Para port_id, dado que comenzamos el valor con texto y no con la variable, las comillas no son necesarias para rodear las llaves.

2. Variables especiales

Ansible proporciona una lista de variables predefinidas a las que se puede hacer referencia en las plantillas y los libros de jugadas de Jinja2, pero que el usuario no puede modificar ni definir.

En conjunto, la lista de variables predefinidas de Ansible se conoce como hechos de Ansible y estos se recopilan cuando se ejecuta un libro de jugadas.

Para obtener una lista de todas las variables de Ansible, use el módulo de configuración en el comando ad-hoc de Ansible como se muestra a continuación:

# ansible -m setup hostname

Esto muestra la salida en formato JSON como se muestra:

# ansible -m setup localhost

En la salida, podemos ver que algunos de los ejemplos de variables especiales de Ansible incluyen:

ansible_architecture
ansible_bios_date
ansible_bios_version
ansible_date_time
ansible_machine
ansible_memefree_mb
ansible_os_family
ansible_selinux

Hay muchas otras variables especiales de Ansible, estos son solo algunos ejemplos.

Estas variables se pueden usar en una plantilla Jinja2 como se muestra:

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

3. Variables de inventario

Por último, en la lista, tenemos las variables de inventario de Ansible. Un inventario es un archivo en formato INI que contiene todos los hosts que serán administrados por Ansible.

En los inventarios, puede asignar una variable a un sistema host y luego usarla en un libro de jugadas.

[web_servers]

web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=ubuntu http_port=8080

Lo anterior se puede representar en un archivo YAML de libro de jugadas como se muestra:

---
   web_servers:
     web_server_1:
        ansible_user=centos
	   http_port=80

web_server_2:
        ansible_user=ubuntu
	   http_port=8080

Si los sistemas host comparten las mismas variables, puede definir otro grupo en el archivo de inventario para hacerlo menos engorroso y evitar repeticiones innecesarias.

Por ejemplo:

[web_servers]

web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=centos http_port=80

Lo anterior se puede estructurar como:

[web_servers]
web_server_1
web_server_2


[web_servers:vars]
ansible_user=centos
http_port=80

Y en el archivo YAML del libro de jugadas, esto se definirá como se muestra:

---
   web_servers:
    
     hosts: 
       web_server_1:
	  web_server_2:

     vars: 
        ansible_user=centos
   http_port=80

Hechos de Ansible

Al ejecutar libros de jugadas, la primera tarea que realiza Ansible es la ejecución de la tarea de configuración. Estoy bastante seguro de que debe haber encontrado el resultado:

TASK:  [Gathering facts] *********

Los hechos de Ansible no son más que propiedades del sistema o piezas de información sobre los nodos remotos a los que se ha conectado. Esta información incluye la arquitectura del sistema, la versión del sistema operativo, la información del BIOS, la fecha y hora del sistema, el tiempo de actividad del sistema, la dirección IP y la información del hardware, por mencionar solo algunos.

Para obtener información sobre cualquier sistema, simplemente use el módulo de configuración como se muestra en el siguiente comando:

# ansible -m setup hostname

Por ejemplo:

# ansible -m setup database_server

Esto imprime un gran conjunto de datos en formato JSON como se muestra:

Los hechos de Ansible son útiles para ayudar a los administradores del sistema a saber qué operaciones realizar, por ejemplo, dependiendo del sistema operativo, pueden saber qué paquetes de software deben instalarse y cómo deben configurarse, etc.

Hechos personalizados

¿Sabía también que puede crear sus propios datos personalizados que Ansible puede recopilar? Sí tu puedes. Entonces cómo vas acerca de ésto? Cambiemos de velocidad y veamos cómo.

El primer paso es crear un directorio /etc/ansible/facts.d en el nodo administrado o remoto.

Dentro de este directorio, cree un archivo (s) con una extensión .fact . Este archivo (s) devolverá datos JSON cuando el libro de jugadas se ejecute en el nodo de control de Ansible, que incluye los otros datos que Ansible recupera después de ejecutar el libro de jugadas.

A continuación, se muestra un ejemplo de un archivo de hechos personalizado llamado date_time.fact que recupera la fecha y la hora.

# mkdir -p /etc/ansible/facts.d
# vim /etc/ansible/facts.d/date_time.fact

Agregue las siguientes líneas en él.

#!/bin/bash
DATE=`date`
echo "{\"date\" : \"${DATE}\"}"

Guardar y salir del archivo.

Ahora asigne los permisos de ejecución:

# chmod +x /etc/ansible/facts.d/date_time.fact

Ahora, creé un libro de jugadas en el nodo de control de Ansible llamado check_date.yml.

---

- hosts: webservers

  tasks:
   - name: Get custom facts
     debug:
      msg: The custom fact is {{ansible_local.date_time}}

Agregue el archivo de hechos a la variable ansible_local. Ansible_local almacena todos los hechos personalizados.

Ahora ejecute el libro de jugadas y observe cómo Ansible recupera la información guardada en el archivo de hechos:

# ansible_playbook check_date.yml

Esto nos lleva al final de este tutorial sobre cómo trabajar con variables y hechos de Ansible.