Cuál es el enfoque adecuado para elegir entre vars y defaults, cuando definimos variables en un rol de Ansible. Esta pregunta se puede resolver de acuerdo al alcance de las variables y su relación con la precedencia en su ejecución.
Una de las utilidades de las variables en Ansible es que permiten establecer las diferencias, por ejemplo de configuración, entre los sistemas con los que trabajamos.
En Ansible encontramos tres principales categorías, para las variables, de acuerdo a su alcance Globales, de Jugada y Host.
- Globales: establecidas por medio de la configuración, las variables de entorno y la linea de comandos (vars; vars_files; vars_prompt)
- Jugada: las contenidas en las jugadas, en vars o defaults de un rol
- Host: las variables asociadas al host ( inventory, include_vars, facts o salidas de tareas registradas)
En este caso nos interesa construir un enfoque para determinar cuál es el mejor lugar para nuestras variables, en un rol.
En un rol solemos tener la siguiente estructura.
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
├── .travis.yml
└── vars
└── main.yml
En la anterior estructura de directorios y archivos nos interesa defaults/main.yml y vars/main.yml. Ambos archivos están destinados a contener las variables del rol.
La principal diferencia entre cada archivo es su precedencia y prioridad en la que son consideradas las variables de defaults/main.yml y vars/main.yml.
Para ejemplificar, el orden en el que son considerados los archivos de un rol, de acuerdo a su precedencia, es el siguiente de menor a mayor:
- defaults/main.yml
- handlers/main.yml
- tasks/main.yml
- vars/main.yml
Los últimos archivos enumerados tienen mayor prioridad sobre los primeros. Por lo que vars/main.yml tiene una mayor prioridad en comparación con defaults/main.yml. Esto significa que si se definen variables con el mismo nombre en vars/main.yml y en defaults/main.yml, vars/main.yml sobrescribiera la variable contenida en vars/main.yml.
Para responder a nuestra pregunta inicial sobre en dónde es mejor colocar nuestras variables, entre estas opciones. Un enfoque posible a considerar para mantener la coherencia de nuestros roles y mantener la filosofía de diseño de Ansible es considerar a defaults.yml para las variables que el usuario no debe modificar, y vars.yml para las variables que pueden requerir ser modificadas por el usuario.
Variable precedence https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable
Scoping Variables https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable