Jak se dědí nedefinované proměnné s Jinja2?

0

Otázka

V mém Ansible rolí, některé role odvodit konkrétní konfiguraci nastavení z globální proměnné Globální proměnné mohou být definované. Následující kód ilustruje schéma:

- 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'

Vše funguje jak má, ale poslední prohlášení: Ansible vyvolává výjimku, protože foo je nedefinovaná (ano, to je nedefinované).

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"}

Tak proč bar ne "vyhodnotit" undefined jako foo? A jak mohu pasti, "multi-level" undefinedness?

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

Zkuste toto:

- 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: Ano, jistě... A pokud spustíte svůj scénář a pak uvidíte, že to běží v pohodě...
Swifty

ano...souhlasím s tebou,
Frenchy

Díky, @Swifty. Nicméně, Ansible ukazuje vars.bar jak je definována pomocí kódu: text TASK [debug] ************************************************************************************************************************************************************* ok: [localhost] => { "msg": "bar is defined" } Pravděpodobně proto, že drží šablonu string?
Stephan

ano, jeho pořádku, tak foo je definována znamená, bar definovanými
Frenchy

Ale foo není definováno ...
Stephan

foo není definován znamená, bar není definována..stačí zkontrolovat, zda foo je definován zkontrolujte, zda panel je definován
Frenchy

@Stephan Prosím pochopit rozdíl mezi '{{ foo }}' a "{{ foo }}"... "{{ foo }}" znamená proměnnou,... '{{ foo }}' znamená to doslova, že řetězec...
Swifty
0

Problém je, že bar je technicky definována, a vaše definice bar používá možná nedefinované proměnné. Když se pokusíte udělat něco s bar to musí být hodnoceny jako nezávislý Jinja výraz, který se děje před is defined podívejte se.

Jeden způsob, jak řešit to, je to tak bar mohou být hodnoceny, aniž by to vedlo v nedefinovanou hodnotu, např.

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

Můžete se také podívat foo před barem, protože hodnocení je krátká-circuitable, ale pečení znalosti proměnné vztah do svých úkolů může být nepraktické.

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

Vezměte prosím na vědomí, že @Stephan definovanými bar proměnné jako řetězec! bar: '{{ foo }}' doslova znamená žihadlo!!!
Swifty
-1

zkuste přidat

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

vars je bez dokladů vnitřní implementace, které mohou být odstraněny v budoucnu, a neměly by být použity.
flowerysong

V jiných jazycích

Tato stránka je v jiných jazycích

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