tutorial tower source open logo hat ansible

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.