Comment hériter des variables non définies avec Jinja2?

0

La question

Dans mon Ansible rôles, certains rôles dériver les paramètres de configuration spécifiques à partir de variables globales les variables Globales peuvent être indéfini. Le code suivant illustre le 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'

Tout fonctionne comme prévu, mais la dernière déclaration: Ansible soulève une exception parce que foo n'est pas défini (oui, il n'est pas défini).

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

Alors, pourquoi ne bar pas “évaluer” à undefined comme foo? Et comment puis-je piège de ce “multi-niveau” undefinedness?

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

Essayez ceci:

- 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: Oui, en effet... Et si vous exécuter mon script, vous verrez qu'elle fonctionne très bien...
Swifty

oui...je suis d'accord avec vous,
Frenchy

Merci, @Swifty. Cependant, Ansible montre vars.bar comme défini avec votre code: text TASK [debug] ************************************************************************************************************************************************************* ok: [localhost] => { "msg": "bar is defined" } Sans doute parce qu'il détient le modèle de chaîne de caractères?
Stephan

oui sa droite, de sorte que foo est défini implique bar défini
Frenchy

Mais foo n'est pas définie ...
Stephan

foo pas défini implique bar pas définie..vous n'avez qu'à vérifier si toto est défini pour vérifier si la barre est défini
Frenchy

@Stephan s'il vous Plaît comprendre la différence entre '{{ foo }}' et "{{ foo }}"... "{{ foo }}" désigne une variable... '{{ foo }}' littéralement signifie que la chaîne de...
Swifty
0

Le problème est que la barre est techniquement définie, et votre définition de bar utilise une variable non définie. Lorsque vous essayez de faire quelque chose avec bar il est évalué en tant qu'indépendant Jinja expression, qui se produit avant l' is defined de vérifier.

Une façon de régler ce problème est de faire en sorte bar peut être évaluée sans qu'il en résulte une valeur non définie, par ex.

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

Vous pouvez aussi vérifier foo avant de bar depuis l'évaluation est court-circuitable, mais la cuisson de la connaissance de la variable de la relation dans vos tâches peut être difficile à gérer.

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

Veuillez noter que @Stephan défini le bar de la variable une chaîne de caractères! bar: '{{ foo }}' signifie littéralement une piqûre!!!
Swifty
-1

essayez d'ajouter

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

vars est une sans-papiers interne de mise en œuvre qui pourrait être supprimée dans le futur et ne doit pas être utilisé.
flowerysong

Dans d'autres langues

Cette page est dans d'autres langues

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