Ako zdediť nedefinované premenné s Jinja2?

0

Otázka

V mojom Ansible úlohy, niektoré úlohy sa odvodzujú konkrétnu konfiguráciu nastavenia z globálnych premenných, Globálne premenné, ktoré by mohlo byť definované. Nasledujúci kód ukazuje 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šetko funguje, ako sa očakávalo, ale posledné vyhlásenie: Ansible vyvolá výnimku, pretože foo je nedefinovaný (áno, 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 prečo bar nie "vyhodnotiť" na undefined ako foo? A ako môžem pasce tejto "multi-level" undefinedness?

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

Skúste 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: Áno, naozaj... A ak sa dostanete môj skript potom uvidíte, že to funguje správne...
Swifty

áno...súhlasím s vami,
Frenchy

Vďaka, @Swifty. Avšak, ukazuje Ansible vars.bar ako sú definované pomocou kódu: text TASK [debug] ************************************************************************************************************************************************************* ok: [localhost] => { "msg": "bar is defined" } Pravdepodobne preto, že to drží šablóny reťazec?
Stephan

áno svoje právo, tak foo je definovaný znamená, bar definované
Frenchy

Ale foo nie je definovaný ...
Stephan

foo, ktoré nie sú definované znamená, bar, ktoré nie sú definované..stačí ak chcete skontrolovať, či foo je definovaná ak chcete skontrolovať, či bar je definovaná
Frenchy

@Stephan Prosím, pochopiť rozdiel medzi '{{ foo }}' a "{{ foo }}"... "{{ foo }}" znamená premennej... '{{ foo }}' doslovne znamená, že reťazec...
Swifty
0

Problém je, že bar je technicky definované, a vaša definícia bar používa prípadne nedefinované premenné. Keď sa pokúsite niečo urobiť s bar to má byť hodnotené ako nezávislý Jinja prejavu, ktoré sa stane pred is defined skontrolujte.

Jeden spôsob, ako riešiť tento je, aby to tak bar môžu byť hodnotené bez výsledného v nedefinovanej hodnoty, napr.

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

Môžete tiež skontrolovať foo pred bar pretože hodnotenie je krátky-circuitable, ale pečenie vedomosti premennej vzťah do vášho úloh môže byť nemotorný.

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

Vezmite prosím na vedomie, že @Stephan definované bare ako variabilný string! bar: '{{ foo }}' doslova znamená sting!!!
Swifty
-1

skúste pridať

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

vars je nepopísaný vnútorného vykonávanie, ktoré môžu byť odstránené v budúcnosti a nemali by byť použité.
flowerysong

V iných jazykoch

Táto stránka je v iných jazykoch

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