Cum de a moșteni nedefinit de variabile cu Jinja2?

0

Problema

În Ansiblu roluri, unele roluri decurg anumite setări de configurare de la variabile globale variabilele Globale ar putea fi nedefinită. Codul de mai jos ilustrează schema:

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

Totul funcționează cum era de așteptat, dar ultima declarație: Ansiblu ridică o excepție pentru că foo este nedefinit (da, este nedefinit).

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

Deci, de ce nu bar nu "evalua" a undefined ca foo? Și cum pot eu să-l prindă pe acest "multi-level" undefinedness?

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

Încercați acest lucru:

- 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: Da, într-adevăr... Și dacă tu a alerga script-ul meu, atunci vei vedea că se execută bine...
Swifty

da...sunt de acord cu tine,
Frenchy

Multumesc, @Swifty. Cu toate acestea, Ansiblu arată vars.bar fi definite cu codul: text TASK [debug] ************************************************************************************************************************************************************* ok: [localhost] => { "msg": "bar is defined" } Probabil pentru că deține șablon string?
Stephan

da, ei bine, așa foo este definit implică bar definite
Frenchy

Dar foo nu este definit ...
Stephan

foo nu este definit implică bar nu este definit..trebuie doar pentru a verifica dacă foo este definit pentru a verifica dacă bara este definit
Frenchy

@Stefan te Rog să înțelegi diferența între '{{ foo }}' și "{{ foo }}"... "{{ foo }}" înseamnă o variabilă... '{{ foo }}' înseamnă literalmente că șir...
Swifty
0

Problema este că bara este tehnic definit și definiția ta bar foloseste un eventual variabile nedefinite. Când ai încerca să faci ceva cu bar trebuie să fie evaluată ca un independent Jinja expresie, care se întâmplă înainte de is defined verificați.

O modalitate de a aborda acest lucru este de a face atât de bar pot fi evaluate fără rezultă într-o valoare nedefinită, de exemplu

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

Puteți verifica, de asemenea, foo înainte de bara de evaluare este de scurtă circuitable, dar copt cunoștințe de variabila de relație în sarcinile pot fi greoi.

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

Vă rugăm să rețineți că @Stephan definite bar variabilă ca un șir de caractere! bar: '{{ foo }}' literalmente înseamnă o intepatura!!!
Swifty
-1

încercați să adăugați

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

vars o fără acte interne de punere în aplicare care pot fi eliminate în viitor și nu ar trebui să fie utilizate.
flowerysong

În alte limbi

Această pagină este în alte limbi

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