जब चर को अनिर्धारित में अपरिभाषित किया जाता है तो कार्य कैसे चलाया जाता है?


115

मैं किसी कार्य को करने का एक तरीका खोज रहा हूँ जब ansible variable registers / undefined उदा न हो

-- name: some task
   command:  sed -n '5p' "{{app.dirs.includes}}/BUILD.info" | awk '{print  $2}'
   when: (! deployed_revision) AND ( !deployed_revision.stdout )
   register: deployed_revision

जवाबों:


213

से ansible डॉक्स : एक आवश्यक चर सेट नहीं किया गया है, तो आप छोड़ सकते हैं या Jinja2 परिभाषित परीक्षण का उपयोग कर सकते हैं असफल। उदाहरण के लिए:

tasks:

- shell: echo "I've got '{{ foo }}' and am not afraid to use it!"
  when: foo is defined

- fail: msg="Bailing out. this play requires 'bar'"
  when: bar is not defined

तो आपके मामले में, when: deployed_revision is not definedकाम करना चाहिए


4
धन्यवाद यह मेरे लिए काम कियाwhen: deployed_revision is not defined or deployed_revision.stdout is not defined or deployed_revision.stdout == ''
sakhunzai

5
आप इसे विभिन्न स्थितियों के साथ भी जोड़ सकते हैं:when: item.sudo is defined and item.sudo == true
czerasz

5
मैंने जो किया वह मत करो और फू के चारों ओर घुंघराले कोष्ठक लगाओ when: foo is defined(जैसे यह काम नहीं करता है:when: {{ foo }} is defined
डेविड

2
@ डेविड मैं आपके साथ भी इसी मुद्दे का सामना कर रहा हूं। सशर्त तोड़ने पर घुंघराले ब्रेसिज़ लगाते हैं। यह काम करने के लिए आपको सशर्त के चारों ओर कोष्ठक जोड़ना होगा। जैसे when: ({{ foo }} in undefined)
तरुण

7
Ansible में सशर्त के लिए घुंघराले ब्रेसिज़ का उपयोग पदावनत है। साथ ही, कोई भी परिवर्तनशील विवरण चर विस्तार (जैसे {{ foo }}) से शुरू नहीं हो सकता है । ऐसा अंसिबल के कारण नहीं है, लेकिन यमल इसे एक वस्तु के रूप में व्याख्या करेगा। यदि आपको एक चर विस्तार के साथ शुरू करने की आवश्यकता है "{{ foo }}", तो यमल को एक स्ट्रिंग के रूप में देखने और इसे पास करने के लिए बाध्य करने के लिए यथाशक्ति डबल कोट्स (जैसे ) के साथ पूरी चीज़ को घेरें।
विक्टर श्रोडर

11

एक नवीनतम चर संस्करण 2.5 के अनुसार, यह जांचने के लिए कि क्या कोई चर परिभाषित किया गया है और इस पर निर्भर करता है कि आप कोई कार्य चलाना चाहते हैं, undefinedकीवर्ड का उपयोग करें ।

tasks:
    - shell: echo "I've got '{{ foo }}' and am not afraid to use it!"
      when: foo is defined

    - fail: msg="Bailing out. this play requires 'bar'"
      when: bar is undefined

उत्तर देने योग्य दस्तावेज


5

कड़ाई से कहा गया है कि आपको निम्न में से सभी की जांच करनी चाहिए: परिभाषित, खाली नहीं और कोई नहीं।

"सामान्य" चर के लिए यदि यह परिभाषित और सेट या सेट नहीं है तो फर्क पड़ता है। नीचे दिए गए उदाहरण में देखें fooऔर bar। दोनों परिभाषित हैं लेकिन केवलfoo सेट है।

दूसरी तरफ पंजीकृत चर चल रहे कमांड के परिणाम पर सेट होते हैं और मॉड्यूल से मॉड्यूल में भिन्न होते हैं। वे ज्यादातर जसन संरचनाएँ हैं। आपको संभवतः उस सबलेमेंट की जांच करनी होगी जिसमें आप रुचि रखते हैं। नीचे दिए गए उदाहरण में देखें xyzऔर देखें xyz.msg:

cat > test.yml <<EOF
- hosts: 127.0.0.1

  vars:
    foo: ""          # foo is defined and foo == '' and foo != None
    bar:             # bar is defined and bar != '' and bar == None

  tasks:

  - debug:
      msg : ""
    register: xyz    # xyz is defined and xyz != '' and xyz != None
                     # xyz.msg is defined and xyz.msg == '' and xyz.msg != None

  - debug:
      msg: "foo is defined and foo == '' and foo != None"
    when: foo is defined and foo == '' and foo != None

  - debug:
      msg: "bar is defined and bar != '' and bar == None"
    when: bar is defined and bar != '' and bar == None

  - debug:
      msg: "xyz is defined and xyz != '' and xyz != None"
    when: xyz is defined and xyz != '' and xyz != None
  - debug:
      msg: "{{ xyz }}"

  - debug:
      msg: "xyz.msg is defined and xyz.msg == '' and xyz.msg != None"
    when: xyz.msg is defined and xyz.msg == '' and xyz.msg != None
  - debug:
      msg: "{{ xyz.msg }}"
EOF
ansible-playbook -v test.yml
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.