कैसे करने के लिए वारिस अपरिभाषित चर के साथ Jinja2?

0

सवाल

मेरे Ansible भूमिकाओं के लिए, कुछ भूमिकाओं प्राप्त विशिष्ट विन्यास सेटिंग्स से वैश्विक चर वैश्विक चर हो सकता है अपरिभाषित. निम्न कोड illustrates स्कीमा:

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

सब कुछ काम करता है के रूप में की उम्मीद है, लेकिन पिछले बयान: Ansible अपवाद उठाती है क्योंकि foo अपरिभाषित है (हाँ, यह अपरिभाषित है).

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

तो क्यों करता है bar नहीं "मूल्यांकन" करने के लिए undefined की तरह foo? और कैसे कर सकते हैं मैं इस जाल "बहु-स्तर" undefinedness?

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

इस प्रयास करें:

- 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: हाँ, वास्तव में... और अगर आप को चलाने मेरी स्क्रिप्ट है तो आप देखेंगे कि यह ठीक चलता है...
Swifty

हाँ...मैं आप के साथ सहमत हैं,
Frenchy

धन्यवाद, @Swifty. हालांकि, Ansible से पता चलता है vars.bar के रूप में परिभाषित किया है अपने कोड के साथ: text TASK [debug] ************************************************************************************************************************************************************* ok: [localhost] => { "msg": "bar is defined" } शायद, क्योंकि यह धारण टेम्पलेट स्ट्रिंग?
Stephan

अपनी हाँ ठीक है, तो foo परिभाषित किया गया है का तात्पर्य बार परिभाषित
Frenchy

लेकिन foo परिभाषित नहीं है ...
Stephan

foo परिभाषित नहीं निकलता बार परिभाषित नहीं..आप बस है अगर जाँच करने के लिए foo परिभाषित किया गया है अगर जाँच करने के लिए बार परिभाषित किया गया है
Frenchy

@स्टीफ़न कृपया समझते हैं के बीच अंतर '{{ foo }}' और "{{ foo }}"... "{{ foo }}" इसका मतलब है एक चर... '{{ foo }}' इसका मतलब है कि सचमुच स्ट्रिंग...
Swifty
0

समस्या यह है कि बार तकनीकी रूप से परिभाषित है, और अपनी परिभाषा के bar का उपयोग करता है एक संभवतः अपरिभाषित चर. जब आप का प्रयास करने के लिए कुछ भी नहीं के साथ bar यह मूल्यांकन किया गया है के रूप में एक स्वतंत्र Jinja अभिव्यक्ति है, जो होता है से पहले is defined की जाँच करें ।

एक तरह से यह पता करने के लिए बनाने के लिए है, तो bar मूल्यांकन किया जा सकता है में जिसके परिणामस्वरूप के बिना एक अपरिभाषित मूल्य, उदाहरण के लिए

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

आप भी जाँच कर सकते हैं foo से पहले बार के बाद से मूल्यांकन कम है-circuitable, लेकिन पाक ज्ञान चर के संबंध में अपने कार्यों को कर सकते हैं हो बोझल.

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

कृपया ध्यान दें कि @स्टीफ़न परिभाषित बार चर एक स्ट्रिंग के रूप में! bar: '{{ foo }}' सचमुच मतलब है एक स्टिंग!!!
Swifty
-1

जोड़ने का प्रयास करें

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

vars है एक undocumented आंतरिक कार्यान्वयन है कि हटाया जा सकता है भविष्य में और नहीं किया जाना चाहिए ।
flowerysong

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

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