tower - ansible tutorial
¿Cuál es la diferencia entre los valores predeterminados y los vars en un rol Ansible? (4)
Al crear una nueva función Ansible, la plantilla crea un directorio
vars
y un directorio
defaults
con un archivo
main.yml
vacío.
Al definir mi rol, puedo colocar definiciones variables en cualquiera de estos, y estarán disponibles en mis tareas.
¿Cuál es la diferencia entre poner las definiciones en
defaults
y
vars
?
¿Qué debería entrar en los
defaults
y qué debería entrar en los
vars
?
¿Tiene sentido usar ambos para los mismos datos?
Sé que hay una diferencia de precedencia / prioridad entre los dos, pero me gustaría entender qué debería ir a dónde.
Digamos que mi rol crearía una lista de directorios en el sistema de destino. Me gustaría proporcionar una lista de directorios predeterminados que se crearán, pero me gustaría permitir que el usuario los anule al usar el rol.
Así es como se vería esto:
---
- directories:
- foo
- bar
- baz
Podría colocar esto en los
defaults/main.yml
o en los
vars/main.yml
, desde una perspectiva de ejecución, no haría ninguna diferencia, pero ¿a dónde debería ir?
En mi humilde opinión, no es práctico y no es sensato que Ansible otorgue tanta prioridad a la configuración en
varios
roles
.
La configuración en
vars/main.yml
y
defaults/main.yml
debe ser baja y probablemente la misma prioridad.
¿Hay ejemplos de la vida real de casos en los que queremos este tipo de comportamiento?
Hay ejemplos de que no queremos esto.
El punto a
defaults/main.yml
aquí es que la configuración en
defaults/main.yml
no puede ser dinámica.
Configuración en
vars/main.yml
can.
Entonces, por ejemplo, puede incluir la configuración para un sistema operativo específico y una versión dinámica como se muestra en
geerlingguy.postgresql
Pero debido a que la precedencia es tan extraña y poco práctica en Ansible, geerlingguy necesita introducir pseudo variables como se puede ver en variables.yml
-name: install package
yum: name=xyz{{package_version}} state=present
Este es un ejemplo concreto de la vida real que demuestra que la precedencia no es práctica.
Otro punto a destacar aquí es que queremos que los roles sean configurables. Los roles pueden ser externos, gestionados por otra persona. Como regla general, no desea que la configuración en roles tenga alta prioridad.
La documentación de Ansible sobre precedencia variable resume este niceley:
Si se definen múltiples variables del mismo nombre en diferentes lugares, ganan en un cierto orden, que es:
- los vars adicionales (-e en la línea de comando) siempre ganan
- luego vienen las variables de conexión definidas en el inventario (ansible_ssh_user, etc.)
- luego viene "casi todo lo demás" (cambios de línea de comando, vars en juego, vars incluidos, vars de roles, etc.)
- luego viene el resto de las variables definidas en el inventario
- luego vienen hechos descubiertos sobre un sistema
- luego "valores predeterminados de roles", que son los más "predeterminados" y pierden prioridad en todo.
Supongamos que tiene una función de "tomcat" que utiliza para instalar Tomcat en un grupo de servidores web, pero necesita diferentes versiones de tomcat en un par de hosts, necesita que se ejecute como diferentes usuarios en otros casos, etc.
defaults/main.yml
archivo
defaults/main.yml
podría verse así:
tomcat_version: 7.0.56
tomcat_user: tomcat
Dado que esos son solo valores predeterminados, significa que se usarán si esas variables no están definidas en otro lugar para el host en cuestión. Puede anularlos a través de variables adicionales, a través de hechos en su archivo de inventario, etc. para especificar diferentes valores para estas variables.
Editar: Tenga en cuenta que la lista anterior es para Ansible 1.x. En Ansible 2.x, la lista se ha ampliado. Como siempre, la documentación de Ansible proporciona una descripción detallada de la precedencia variable para 2.x.
Las variables de rol definidas en
var
tienen una prioridad muy alta: solo se pueden sobrescribir pasándolas en la línea de comando, en la tarea específica o en un bloque.
Por lo tanto, casi todas sus variables deben definirse de manera
defaults
.
En el artículo "
Precedencia variable: dónde colocar sus variables de rol
", el autor da un ejemplo de qué poner en
vars
: constantes específicas del sistema que no cambian mucho.
Por lo tanto, puede tener
vars/debian.yml
y
vars/centos.yml
con los mismos nombres de variables pero con valores diferentes e incluirlos condicionalmente.
Las variables y los valores predeterminados van de la mano. aquí hay un ejemplo
package_version: 123
en su archivo predeterminado tendría algo como:
-name: install package
yum: name=xyz123 state=present
Lo que ansible hará es tomar el valor de
package_version
y colocarlo junto al nombre del paquete para que se lea en alguna parte como:
-name: install package yum: name=xyz123 state=present
De esta manera, instalará
xyz123
y no
xyz123.4
o lo que sea que esté en el gran repositorio de xyz.
Al final hará
yum install -y xyz123
Básicamente, los valores predeterminados son los valores presentes, si no establece un valor específico para las variables, ese espacio no puede permanecer vacío.