Tutoriales

Variables de Ansible – OSTechNix

En el artículo anterior, lo que discutimos Libro de jugadas de Ansible es y cómo crear y ejecutar tareas a través de playbooks. En este artículo, daremos un paso más y aprenderemos a usar variables en los libros de jugadas de Ansible.

¿Qué son las variables de Ansible?

variable es un concepto fundamental en todos los lenguajes de programación para almacenar datos y luego usarlos en el código. Además, ansible tiene variables que almacenan algunos valores, que luego se usan para diferentes procesamientos en el libro de jugadas.

Ansible admite la declaración de variables en varios lugares, como playbooks, archivos host_vars y group_vars, y argumentos de línea de comandos.

En las siguientes secciones, discutiremos cómo definir variables en diferentes lugares y comprender la precedencia de variables.

Variable – clave, mapa de valores

Las variables se pueden utilizar a nivel de juego y nivel de tarea»vars» palabra clave. Después de la palabra clave vars, se dan variables con clave y valor. Todas las tareas del juego pueden acceder a estas variables.

He creado una tarea que imprime un mensaje por valor de variable utilizando el módulo de depuración.Las variables deben encerrarse entre llaves dobles {{ Cambiando}}.

Publicaciones relacionadas

Cómo usar módulos de depuración en Ansible Playbooks

- name: Print vars
  hosts: m1
  gather_facts: false

  vars:
    os_name: "PoP!_OS Desktop"
    version: "21.10"

  tasks:
    - name: Task1 - Substitute variables
      debug:
        msg: "My current desktop OS is {{ os_name }} - {{ version }}"
Key-value variable Mapping

Ahora, para ejecutar el libro de jugadas, ejecute el siguiente comando en la terminal.

$ ansible-playbook playbook_name.yml

En la imagen a continuación, puede ver que mis dos variables se reemplazan con sus valores GMS Imprimir en salida estándar.

salida de tarea

variable – lista de elementos

Puede crear una lista de elementos en una variable. Si observa la definición a continuación, he creado una variable de lista de dos maneras.

  • Manera YAML estándar de definir una lista de artículos/elementos.Aquí especifico el nombre de la variable como «top_linux_desktops».
  • Sintaxis de Python para crear una lista de artículos/elementos.Aquí especifico el nombre de la variable como «top_desktops».
  vars:
    
    top_linux_desktops:
      - MXlinux
      - pop-os
      - Linux Mint
      - Manjaro
      - Fedora

    top_desktops: [MXLinux, pop-os, Linux Mint, Manjaro, Fedora]

Puede utilizar nombres de variables para imprimir todos los elementos de una lista. Creé dos tareas.La primera tarea se imprimirá desde top_linux_desktops variable y la segunda tarea imprimirá el elemento top_desktops Cambiando.

  tasks:
    - name: Task1 - List of elements
      debug:
        msg: "My fav linux desktops are {{ top_linux_desktops }}"

    - name: Task2 - List of elements using Python syntax
      debug:
        msg: "My fav linux desktops are {{ top_desktops }}"    
lista de elementos
lista de elementos

En una lista, también puede acceder a un solo elemento usando su posición de índice, similar a cómo accede a los elementos de una lista de python. Hay dos maneras de hacer esto.

  • Usar notación de puntos (variable.index)
  • Notación de Python (variable[index])

Creé dos tareas. La primera tarea usa notación de puntos y la segunda tarea imprime elementos de la primera y segunda posición usando notación de python.

  tasks:    

    - name: Task3 - Accessing List element using dot notation
      debug:
        msg: "My fav linux desktops are {{ top_linux_desktops.1 }} and {{ top_desktops[2] }}"

    - name: Task4 - Accessing List element using python notation(list[i])
      debug:
        msg: "My fav linux desktops are {{ top_linux_desktops[1] }} and {{ top_desktops[2] }}"
elemento de impresión usando la posición de índice
elemento de impresión usando la posición de índice

variable – diccionario

Puede crear un objeto de diccionario y asignarlo a una variable. Esto es similar a un diccionario de Python. Los diccionarios se pueden crear de dos maneras.

  • Sintaxis YAML estándar para definir diccionarios
  • Notación de diccionario de Python

Si puede ver el fragmento de script a continuación, he creado dos variables de diccionario.primera variable «lanzamiento de noticias» Siga el método de sintaxis YAML y la segunda variable «new_release_info» Sigue la sintaxis del diccionario de Python.

  vars:
    release_info:
      name: PoP!_OS Desktop
      version: 22.04
      release_month: April, 2022
    
    new_release_info: { name: PoP!_OS Desktop, version: 22.04, release_month: "April, 2022"}

Puede obtener todos los valores de una variable o un elemento de diccionario específico utilizando su clave. Al igual que las listas, los diccionarios también siguen la notación de punto y python para imprimir el valor de una clave.

Creé dos tareas, la primera tarea usará notación de puntos Obtenga el elemento del diccionario, la segunda tarea usará símbolo de pitón Coge el elemento.

  tasks:

    - name: Task1 - Accessing dictionary values using its key with dot notation(dict.key)
      debug:
        msg: "{{ release_info.name }} version {{ release_info.version }} is released on {{ release_info.release_month }}"

    - name: Task2 - Accessing dictionary values using its key with python notation(dict['key'])
      debug:
        msg: "{{ new_release_info['name'] }} version {{ new_release_info['version'] }} is released on {{ new_release_info['release_month'] }}"
variable de diccionario - salida
variable de diccionario – salida

Juega con prioridad de nivel de tarea

Las variables se pueden definir en el nivel de la misión y en el nivel del juego, pero las variables definidas en el nivel de la misión tienen prioridad sobre las variables definidas en el nivel del juego.

En el siguiente ejemplo, he creado variables con el mismo nombre de variable en el nivel de juego y en el nivel de tarea. Ahora, cuando ejecuto el libro de jugadas, usa el nombre de la variable de tarea.

  vars:
    os_name: "PoP!_OS Desktop"
    version: "21.10"

  tasks:
    - name: Task1 - Substitute variables
      vars:
        os_name: "Linux Mint"
        version: "20.03"
      debug:
          msg: "My current desktop OS is {{ os_name }} - {{ version }}"
Misiones y Juegos - Prioridades
Misiones y Juegos – Prioridades

Libro de jugadas con precedencia de argumentos de línea de comando

Puede anular las variables pasadas en el libro de jugadas usando -e bandera.La variable pasada tiene mayor prioridad -e bandera.

Estoy ejecutando el mismo libro de jugadas de la sección anterior, nuevamente usando -e bandera.

$ ansible-playbook 4_var_precedence.yml -e "os_name=fedora" -e "version=35"
Variables usando argumentos de línea de comando
Variables usando argumentos de línea de comando

Puede pasar variables a -e Iniciar sesión Json, YAML o ini Formato.

# INI FORMAT
$ ansible-playbook 4_var_precedence.yml -e "os_name=fedora" -e "version=35"

# JSON FORMAT
$ ansible-playbook 4_var_precedence.yml -e '{"os_name": "fedora"}' -e '{"version": 35}'

# YAML FORMAT
$ ansible-playbook 4_var_precedence.yml -e "{os_name: fedora}" -e "{version: 35}"

También puede crear un archivo separado para la variable y pasarlo -e bandera. La sintaxis es la siguiente.Aquí, creé un archivo llamado vars.yml y agrupar todas mis variables.Ahora, cuando el archivo se pasa a -e Marque todas las variables que se importarán al libro de jugadas.

$ ansible-playbook 4_var_precedence.yml -e @vars.yml

archivo de variables

En lugar de definir variables en el libro de jugadas, puede crear un archivo y declarar todas las variables en el archivo.Creé un archivo llamado vars.yml y agrupe todas las variables que discutimos en las secciones anteriores en este archivo.

variables declaradas en el archivo
variables declaradas en el archivo

en lugar de usar palabras clave variableDeberías usar archivos_vars en el libro de jugadas y pase el nombre del archivo. Ahora, cuando ejecute el libro de jugadas, ansible recogerá las variables del archivo. El archivo puede estar en cualquier ruta.

Palabra clave Var_files en el libro de jugadas
Palabra clave Var_files en el libro de jugadas
variables definidas en el archivo
variables definidas en el archivo

variables de host y de grupo

Puede definir variables a nivel de host y de grupo en el archivo de manifiesto. Puede consultar los siguientes artículos, donde analizamos brevemente cómo crear variables a nivel de host y de grupo.

Archivos de configuración e inventario de Ansible

Como práctica recomendada, no debe definir variables en el archivo de manifiesto, sino que puede host_vars y group_vars ansible seleccionará automáticamente los archivos en el directorio.Crear un host_vars.

$ mkdir host_vars

en host_vars directorio, puede definir variables a nivel de host, es decir, puede crear archivos en formato INI, YAML o JSON y almacenar variables para un host específico. Si observa el archivo de manifiesto a continuación, tengo dos hosts llamados «ubuntu» y «rocky» y he creado archivos variables para cada host.

Cuidado: El nombre del archivo debe ser el mismo que el nombre de host/alias en el archivo de manifiesto.

# Inventory file
[m1]
ubuntu ansible_host=ubuntu.anslab.com 

[m2]
rocky ansible_host=rocky.anslab.com
$ mkdir host_vars/ubuntu.yml
$ echo "message: This variable is read from host_vars/ubuntu.yml file" > host_vars/ubuntu.yml"

$ mkdir host_vars/rocky.yml
$ echo "message: This variable is read from host_vars/rocky.yml file" > host_vars/rocky.yml

Agregué un archivo llamado «message« en dos archivos de variables. Ahora, si ejecuto mi libro de jugadas, las variables se tomarán de ambos archivos.

Host_vars - definiciones de variables
Host_vars – definiciones de variables

Asimismo, también puede crear archivos de variables para grupos.crear un directorio «group_vars« y cree un archivo con un nombre de grupo basado en el archivo de manifiesto.

[m1]
ubuntu ansible_host=ubuntu.anslab.com 

[m2]
rocky ansible_host=rocky.anslab.com

[servers:children]
m1
m2

Creé un subgrupo llamado «servidor»así que creo el nombre del archivo como servers.yml.

$ mkdir group_vars
$ mkdir group_vars/servers.yml
$ echo "message: This variable is read from group_vars/servers.yml file" > group_vars/servers.yml

Ahora, si ejecuto el libro de jugadas, lee servers.yml Desde group_vars.

variable de grupo
variable de grupo

Cuidado: si ambos host_vars y group_varsansible buscará primero host_vars define, si no se encuentra, irá a group_vars.

variable magica

Ansible proporciona algunas variables internas cuyo estado se define cuando ejecuta el libro de jugadas. Podemos usar estas variables a través del libro de jugadas. Para obtener una lista de las variables especiales disponibles, puede consultar el siguiente enlace.

Variables especiales de Ansible

Por ejemplo, hay una variable llamada inventory_dir Almacena la ruta absoluta al archivo de manifiesto utilizado por el libro de jugadas.

    - name: Magic Variables - Get inventory directory path
      debug:
        msg: "{{ inventory_dir }}"
variable magica
variable magica

Una variable mágica importante es hostvarsEsta variable imprimirá una colección de algunas variables mágicas en formato json.

      - name: Magic Variables - hostvars
        debug:
          msg: "{{ hostvars }}"
Salida HostVars
Salida HostVars

La salida contiene información en formato str, list y dictionary. Supongamos que quiero verificar en qué grupo está mi host de ubuntu, entonces puedo obtenerlo de la siguiente manera. Estoy usando la notación de sintaxis de Python aquí.

      - name: Magic Variables 
        debug:
          msg: "{{ hostvars['ubuntu']['group_names'] }}"
Nombre del grupo
Nombre del grupo

No todas las variables mágicas son útiles en las operaciones diarias. Consulte todas las variables mágicas para ver cuál se ajusta a su caso de uso.

hechos variables

Cuando ejecuta el libro de jugadas, ansible usará el módulo de configuración y recopilará datos del host de destino y mantendrá la salida en la memoria para que pueda usarse en el libro de jugadas. Los hechos también se denominan variables de script.

Primero, comprenda la salida de hechos para obtener propiedades específicas. Ejecute el siguiente comando, que recopilará la salida de hechos y la almacenará en un archivo.

$ ansible all -m setup --tree /tmp/facts_result

Se crearán archivos de salida separados para cada host. Si observa la salida, es solo la salida en formato JSON.

salida de hecho
salida de hecho

Las propiedades en la salida de hechos estarán en formato Lista, Diccionario y AnsibleUnsafeText. A continuación se muestran algunos tipos diferentes de ejemplos.

      - name: Facts output - AnsibleUnsafeText
        debug:
          msg: "{{ discovered_interpreter_python }}"

      - name: Facts output - List
        debug:
          msg: "{{ ansible_all_ipv4_addresses }}"

      - name: Facts output - Dictionary
        debug:
          msg: "{{ ansible_python }}"
hecho de salida 1
salida de hecho

Los hechos recopilan mucha información, así que tómese un momento para revisar el resultado y ver qué se ajusta a sus requisitos.

En conclusión

En esta publicación, discutimos qué son las variables ansibles y cómo declarar variables en diferentes lugares. Al declarar variables, la precedencia de las variables es muy importante y se tratará en este artículo. También discutimos las variables mágicas y sus casos de uso. Finalmente, describimos qué es un hecho y cómo usar la salida del hecho como una variable.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Botón volver arriba