Como herdar variáveis indefinidas com Jinja2?

0

Pergunta

Na minha Ansible funções, algumas funções derivar específicos definições de configuração de variáveis globais variáveis Globais podem ser indefinido. O código a seguir ilustra o 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'

Tudo funciona como o esperado, mas a última instrução: Ansible gera uma exceção, porque foo é indefinido (sim, é 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"}

Então, por que bar não "avaliar" para undefined como foo? E como posso armadilha este "multi-nível" undefinedness?

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

Tente isso:

- 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: Sim, de fato... E se você executar o meu script, em seguida, você vai ver que funciona muito bem...
Swifty

sim...eu concordo com você,
Frenchy

Obrigado, @Swifty. No entanto, Ansible mostra vars.bar como definidos com o seu código: text TASK [debug] ************************************************************************************************************************************************************* ok: [localhost] => { "msg": "bar is defined" } Provavelmente porque ele contém o modelo de cadeia?
Stephan

sim o seu direito, de modo foo é definido implica bar definido
Frenchy

Mas foo não está definido ...
Stephan

foo não definido implica bar não definido..você só tem que verificar se foo for definido para verificar se a barra é definida
Frenchy

@Stephan por Favor, entenda a diferença entre '{{ foo }}' e "{{ foo }}"... "{{ foo }}" significa uma variável... '{{ foo }}' significa, literalmente, que a cadeia...
Swifty
0

O problema é que o bar é tecnicamente definido, e sua definição de bar usa possivelmente uma variável indefinida. Quando você tentar fazer qualquer coisa com bar ele tem de ser avaliado como um ser independente, Jinja expressão, que acontece antes do is defined de seleção.

Uma maneira para resolver esse é torná-la tão bar pode ser avaliado sem resultando em um valor indefinido, e.g.

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

Você também pode verificar foo antes de bar desde a avaliação é de curto circuitable, mas cozimento de conhecimento da variável em relação as tarefas podem ser difíceis de controlar.

- 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, note que o @Stephan definida a barra de variável como uma seqüência de caracteres! bar: '{{ foo }}' significa, literalmente, uma picada!!!
Swifty
-1

tente adicionar

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

vars é uma situação irregular implementação interna que pode ser removida no futuro, e não deve ser usado.
flowerysong

Em outros idiomas

Esta página está em outros idiomas

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