Cómo heredar variables no definidas con Jinja2?

0

Pregunta

En mi Ansible funciones, algunas funciones se derivan de configuración específica de variables globales las variables globales pueden ser indefinido. El código siguiente ilustra el esquema:

- hosts: localhost
  vars:
    bar: '{{ foo }}'
  tasks:
    # Assume foo comes from an Ansible environment
    - debug: var=foo
    # Assume bar comes from a role default
    - debug: var=bar
    # Catched by the "is defined" condition
    - debug: msg="foo is defined"
      when: 'foo is defined'
    # Cannot catch undefined exception?!
    - debug: msg="bar is defined"
      when: 'bar is defined'

Todo funciona como se espera, pero la última instrucción: Ansible plantea una excepción, porque foo no está definido (sí, es indefinido).

PLAY [localhost] *********************************************************************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************************************************************************
ok: [localhost]

TASK [debug] *************************************************************************************************************************************************************
ok: [localhost] => {
    "foo": "VARIABLE IS NOT DEFINED!"
}

TASK [debug] *************************************************************************************************************************************************************
ok: [localhost] => {
    "bar": "VARIABLE IS NOT DEFINED!"
}

TASK [debug] *************************************************************************************************************************************************************
skipping: [localhost]

TASK [debug] *************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"msg": "The conditional check 'bar is defined' failed. The error was: error while evaluating conditional (bar is defined): {{ foo }}: 'foo' is undefined\n\nThe error appears to be in '.../test-undef.yml': line 9, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n      when: 'foo is defined'\n    - debug: msg=\"bar is defined\"\n      ^ here\n"}

Entonces, ¿por qué bar no de "evaluar" a undefined como foo? Y ¿cómo puedo trampa de esta "multi-nivel" undefinedness?

ansible jinja2
2021-11-23 09:46:53
3
0

Intente esto:

- hosts: localhost
  vars:
    bar: '{{ foo }}'
  tasks:
    # Assume foo comes from an Ansible environment
    - debug: var=vars.foo
    # Assume bar comes from a role default
    - debug: var=vars.bar
    # Catched by the "is defined" condition
    - debug: msg="foo is defined"
      when: vars.foo is defined
    # Cannot catch undefined exception?!
    - debug: msg="bar is defined"
      when: vars.bar is defined
2021-11-23 09:57:21

@Frenchy: Sí, de hecho... Y si de ejecutar mi script verás que funciona muy bien...
Swifty

sí...estoy de acuerdo con usted,
Frenchy

Gracias, @Swifty. Sin embargo, Ansible muestra vars.bar como se define con el código: text TASK [debug] ************************************************************************************************************************************************************* ok: [localhost] => { "msg": "bar is defined" } Probablemente debido a que se mantiene la cadena de plantilla?
Stephan

sí su derecho, por lo que foo se define implica bar definido
Frenchy

Pero foo no está definido ...
Stephan

foo no se define implica bar no definido..usted sólo tendrá que comprobar si foo es definido para comprobar si la barra se define
Frenchy

@Esteban por Favor, comprenda la diferencia entre '{{ foo }}' y "{{ foo }}"... "{{ foo }}" significa una variable... '{{ foo }}' significa, literalmente, que la cadena de...
Swifty
0

El problema es que la barra es técnicamente definidas, y su definición de bar utiliza una posible variable no definida. Cuando intento hacer cualquier cosa con bar tiene que ser evaluado de manera independiente como una Jinja expresión, lo que sucede antes de que el is defined de verificación.

Una manera de abordar esta es hacerla tan bar puede ser evaluado sin que ello resulte en un valor indefinido, por ejemplo,

- hosts: localhost
  vars:
    bar: "{{ foo | default(false) }}"
  tasks:
    - debug:
        msg: bar is truthy
      when: bar is truthy

Usted también puede verificar los foo bar desde antes de la evaluación es corto circuitable, pero el bicarbonato de conocimiento de la variable de relación en sus tareas puede ser difícil de manejar.

- hosts: localhost
  vars:
    bar: "{{ foo }}"
  tasks:
    - debug:
        msg: bar is truthy
      when: 
        - foo is defined
        - bar is defined
2021-11-23 17:15:56

Por favor, tenga en cuenta que @Stephan definido la barra de variable como una cadena! bar: '{{ foo }}' literalmente significa un piquete!!!
Swifty
-1

trate de añadir

when: ( vars[bar] is defined )
2021-11-23 15:28:45

vars es un indocumentado implementación interna que puede ser eliminada en el futuro y no debe ser utilizado.
flowerysong

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................