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.
Tabla de Contenidos
¿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}}.
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.
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 }}"
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] }}"
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'] }}"
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 }}"
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"
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.
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.
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.
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.
Cuidado: si ambos host_vars
y group_vars
ansible 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.
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 }}"
Una variable mágica importante es hostvars
Esta variable imprimirá una colección de algunas variables mágicas en formato json.
- name: Magic Variables - hostvars debug: msg: "{{ 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'] }}"
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.
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 }}"
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.