Dependiendo del valor (Verdadero / Falso) de una variable definida en group_vars, estoy tratando de definir algunas variables en un archivo vars. Su valor depende del valor del grupo var.
Mi archivo var actual se ve así:
{% if my_group_var %}
test:
var1: value
var2: value
...
varn: value
{% else %}
test:
var1: other_value
var2: other_value
...
varn: other_value
{% endif %}
Para cada uno de mis roles, estoy usando una variable definida en este archivo.
Mi libro de jugadas de prueba se ve a continuación:
- name: blabla
hosts: blabla
vars_files:
- <path>/test_vars.yml
roles: blabla
El error que recibo después de ejecutar el libro de jugadas es:
{% if my_group_var %}
^ here
exception type: <class 'yaml.scanner.ScannerError'>
exception: while scanning for the next token
found character that cannot start any token
in "<unicode string>"
¿Estoy haciendo algo estúpido aquí o esto ni siquiera es compatible? Traté de encontrar otra forma de definir estos vars (tengo muchos de ellos) pero no pude conseguir algo funcional aquí. ¿Alguna sugerencia?
ansible
automation
jinja
pandoJohn
fuente
fuente
template
llamada de módulo.test
depende del grupo, debe colocarse en group_vars.Respuestas:
No creo que pueda, generalmente creo archivos separados para contener colecciones de variables condicionales y uso una
when
cláusula para incluirlos en una condición específica:fuente
Ansible permite que una de las siguientes formas defina variables condicionalmente:
Combinando la sintaxis anterior con la búsqueda de variables, podemos cargar variables complejas (lista en este caso):
Hay otra forma de realizar la carga de árbol condicional con la búsqueda de vars. Esta manera es útil cuando necesita implementar la lógica de caso (es decir, la variable de condición tiene más de dos valores posibles):
fuente
A pesar de que sería bueno, me temo que tu camino no es posible (o no estoy al tanto).
Sugeriría preparar primero el archivo vars de la plantilla jinja y luego incluirlo con include_vars. Vea el ejemplo de libro de jugadas:
El contenido de la plantilla de ejemplo jinja /tmp/vars.yaml.j2 es:
fuente
- debug: var=test
, puedo ver que están definidos ambostest.var1
ytest.var2
con los valores esperados. Por lo tanto, debería poder usar estas variables en otras tareas del libro de jugadas.AFAIK, esta {} cosa que estás intentando es para las plantillas Jinja2 y no para archivos yml. De la documentación :
Puede preparar un archivo .yml separado con una reproducción que configura las variables que necesita utilizando las cláusulas when, y luego importarlas (o incluirlas) en su libro de jugadas principal. De esa manera, puede tener todos los vars definidos condicionalmente en un solo archivo.
O: use roles. Creo que los roles son el enfoque más adecuado para resolver su problema.
fuente
Lo que hice al final fue crear 2 archivos var separados, llamémoslos
type_a.yml
ytype_b.yml
, y definí una variable de grupo que indica qué archivo usar, algo asítype_of_file: a
. Así es como se ve mi libro de jugadas ahora:Gracias por todas las respuestas. Los encuentro realmente útiles.
fuente
Espero que el siguiente fragmento (tomado de la Documentación Ansible ) pueda ser una valiosa adición a las útiles contribuciones de los anteriores.
fuente