Búsqueda de sitios web

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


Hemos mencionado variables en esta serie de Ansible y solo para refrescar tu mente un poco. 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?

Un nombre de variable incluye letras, números, guiones bajos o una combinación de 2 o todos ellos. 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:

Ejemplos de nombres de variables válidos:

football 
foot_ball
football20 
foot_ball20

Ejemplos de nombres de variables no válidos:

foot ball
20 
foot-ball

Analicemos los tipos de variables:

1. Variables del libro de jugadas

Las variables del Playbook son bastante fáciles y directas. Para definir una variable en un playbook, 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.

Aquí hay un ejemplo simple de un libro de jugadas:

- hosts: all
  vars:
    greeting: Hello world! 

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

En el libro de estrategias anterior, la variable saludo se sustituye por el valor ¡Hola mundo! cuando se ejecuta el libro de estrategias. 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 manual 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 siguiente manual 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, utilice 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 Ansible es la variable diccionario.

Las variables del Diccionario también son compatibles con el libro de estrategias. 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 del 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, no son necesarias comillas 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 manuales de Jinja2, pero que el usuario no puede modificar ni definir.

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

Para obtener una lista de todas las variables de Ansible, utilice el módulo setup 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 el resultado, 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 sólo algunos ejemplos.

Estas variables se pueden utilizar 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 del 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 Ansible debe administrar.

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 de libro de jugadas YAML 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 del libro de jugadas YAML, esto se definirá como se muestra:

---
   web_servers:
    
     hosts: 
       web_server_1:
	  web_server_2:

     vars: 
        ansible_user=centos
   http_port=80

Hechos ansibles

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 debes haber encontrado el resultado:

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

Los hechos ansibles no son más que propiedades del sistema o 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, información del BIOS, fecha y hora del sistema, tiempo de actividad del sistema, dirección IP e información del hardware, por mencionar solo algunos.

Para obtener información sobre cualquier sistema, simplemente use el módulo setup 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 datos de Ansible son útiles para ayudar a los administradores del sistema qué operaciones realizar; por ejemplo, según el 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 tema 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 uno o más archivos con una extensión .fact. Estos archivos devolverán datos JSON cuando el libro de estrategias se ejecute en el nodo de control de Ansible, que incluye los demás datos que Ansible recupera después de ejecutar el libro de estrategias.

A continuación se muestra un ejemplo de un archivo de datos 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 estrategias 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. El ansible_local almacena todos los datos 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

Conclusión

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