Jak odziedziczyć niezdefiniowane zmienne za pomocą Jinja2?

0

Pytanie

W moich rolach Ansible niektóre role otrzymują pewne opcje konfiguracji z globalnych zmiennych zmienne Globalne mogą być niepewne. Poniższy kod ilustruje schemat:

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

Wszystko działa tak, jak oczekiwano, ale ostatnie stwierdzenie: Ansible powoduje wyjątek, bo foo nie określono (tak, to nie jest określona).

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

Więc dlaczego bar nie "oceniać", aby undefined Podoba foo? I jak mogę złapać tę "wielowarstwową" niepewność?

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

Spróbuj to:

- 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: Tak, naprawdę... I jeśli można uruchomić mój skrypt, to zobaczysz, że to działa normalnie...
Swifty

tak...zgadzam się z tobą,
Frenchy

Dziękuję, @Swifty. Tym nie mniej, Ansible pokazuje vars.bar jak określono w kodzie: text TASK [debug] ************************************************************************************************************************************************************* ok: [localhost] => { "msg": "bar is defined" } Prawdopodobnie dlatego, że w nim zawiera ciąg szablonu?
Stephan

tak, to prawda, że foo określony, co oznacza, że bar jest zdefiniowany
Frenchy

Ale foo nie określono ...
Stephan

foo nie jest zdefiniowany oznacza, że bar nie jest zdefiniowany..trzeba tylko sprawdzić, określony czy foo, aby sprawdzić, określony czy bar
Frenchy

@Stefan, proszę zrozumieć różnicę między '{{ foo }}' i "{{ foo }}"... "{{ foo }}" oznacza zmienną... '{{ foo }}' dosłownie oznacza ten wiersz...
Swifty
0

Problem w tym, że bar technicznie jest określony, a twoja definicja bar używa, być może, nieokreślony zmienną. Gdy próbujesz coś zrobić z bar to powinno być ocenione jako niezależne wyrażenie jinja przybytek, który występuje do is defined sprawdzać.

Jednym ze sposobów, aby rozwiązać ten problem-zrobić ją taką bar może być oceniona bez uzyskania nieokreślonej wartości, np.

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

Możesz również sprawdzić foo przed barem, tak jak ocena może być krótki, ale znajomość powiązań zmiennych w swoich zadaniach może być kłopotliwe.

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

Proszę zwrócić uwagę, że @Stephan określił zmienną bar jak wiersz! bar: '{{ foo }}' dosłownie oznacza "żądło"!!!
Swifty
-1

spróbuj dodać

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

vars-to nieudokumentowany wewnętrzna realizacja, która może być usunięta w przyszłości i nie powinny być wykorzystywane.
flowerysong

W innych językach

Ta strona jest w innych językach

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