Al crear una nueva función Ansible, la plantilla crea vars
un defaults
directorio ay un directorio con un main.yml
archivo 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 defaults
y qué debería entrar 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 el defaults/main.yml
o en el vars/main.yml
, desde una perspectiva de ejecución, no haría ninguna diferencia, pero ¿a dónde debería ir?
defaults
y quévars
más abajo.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 endefaults
.En el artículo " Precedencia variable: dónde colocar sus variables de rol ", el autor da un ejemplo de qué poner
vars
: constantes específicas del sistema que no cambian mucho. Por lo tanto, puede tenervars/debian.yml
yvars/centos.yml
con los mismos nombres de variables pero valores diferentes e incluirlos condicionalmente.fuente
En mi humilde opinión no es práctico y no razonable que lugares Ansible tan alta prioridad de la configuración en vars de papeles . La configuración en
vars/main.yml
ydefaults/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
destacar aquí es que la configuración no puede ser dinámica. Configuración envars/main.yml
lata. 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.postgresqlPero 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
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.
fuente
Básicamente, todo lo que entra en los "valores predeterminados de roles" (la carpeta de valores predeterminados dentro del rol) es el más maleable y fácilmente reemplazado. Cualquier cosa en el directorio vars del rol anula las versiones anteriores de esa variable en el espacio de nombres. La idea a seguir aquí es que cuanto más explícito sea el alcance, más prioridad tendrá con la línea de comandos: los vars extra siempre ganan. Las variables de host y / o inventario pueden ganar los valores predeterminados de roles, pero no incluye explícitamente como el directorio vars o una tarea include_vars. Doc
fuente
Las variables y los valores predeterminados van de la mano. aquí hay un ejemplo
en su archivo predeterminado tendría algo como:
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:De esta manera se instalará
xyz123
y noxyz123.4
o lo que sea que esté en el gran repositorio de xyz's.Al final lo hará
yum install -y xyz123
Entonces, básicamente, los valores predeterminados son los valores presentes; si no establece un valor específico para las variables, el espacio no puede permanecer vacío.
fuente
defaults
se usan cuando no hayvars
definidos, pero la respuesta no explica por qué definiría un valor como uno u otro, que es lo que solicitó el OP. Compare con la explicación a continuación.