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:
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 <strong>libro de</strong> 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.
Aquí hay 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.
Variables del libro de jugadas en Ansible
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] }}"
Matriz de variables en Ansible
La lista de variables se puede estructurar de manera similar como se muestra a continuación:
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 }}"
Lista de variables de matriz de Ansible
Otro tipo de variable de Ansible es la variable de diccionario .
Las variables de <strong>diccionario también</strong> 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
Enumerar Variables Ansibles
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 la salida:
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:
Ansible Get System Facts
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 .fact
extensión. 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 . Los 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
Cree hechos personalizados de Ansible
Conclusión
Esto nos lleva al final de este tutorial sobre cómo trabajar con variables y hechos de Ansible.
Ansible