2016-04-06 10 views
9

किसी त्रुटि के बिना बाहर निकलना चाहता हूं (मुझे assert और fail मॉड्यूल के बारे में पता है) जब मैं किसी निश्चित स्थिति को पूरा करता हूं, तो मैं बिना किसी त्रुटि के त्रुटि के बाहर निकलता हूं। निम्नलिखित कोड बाहर निकलता है लेकिन एक विफलता के साथ:मैं किसी शर्त पर मिलने के बिना

tasks: 

    - name: Check if there is something to upgrade 
     shell: if apt-get --dry-run upgrade | grep -q "0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded"; then echo "no"; else echo "yes"; fi 
     register: upgrading 

    - name: Exit if nothing to upgrade 
     fail: msg="Nothing to upgrade" 
     when: upgrading.stdout == "no" 

उत्तर

1

हल करने के लिए यह रिवर्स करने के लिए और अनुकूल ना हो के बजाय हो सकता है अगर वहाँ के उन्नयन के लिए (जो एक अलग कदम है कि केवल करता है कुछ भी नहीं है एक बेहतर और अधिक तार्किक ढंग से कि) upgrade चर के आधार पर आप अपने सभी अपग्रेडिंग कार्यों को सशर्त के साथ जोड़ सकते हैं। संक्षेप में बस

when: upgrading.changed 

कार्यों को केवल अपग्रेड के दौरान निष्पादित किया जाना चाहिए।

यह थोड़ा और काम है, लेकिन यह स्पष्टता भी लाता है और स्वयं में तर्क शामिल होता है जो उस कार्य को प्रभावित करता है, इसके बजाय किसी भी तरीके से निर्भर करता है जो इसे जल्दी से समाप्त कर सकता है या नहीं।

+2

यह असुविधाजनक है जब किसी के बाद कई कार्य हैं जो तय करना है या नहीं: -/ – jhutar

1

क्या Tymoteusz भूमिकाओं के लिए सुझाव का उपयोग करने देता:

दो roles जहां पहली भूमिका की जांच निष्पादित करेंगे (और कुछ चर होल्डिंग की जांच के परिणाम सेट) में अपने खेलने विभाजित और दूसरा एक जांच के परिणाम के आधार पर कार्य करेगा।

मैं इस सामग्री के साथ aaa.yaml बनाया है: roles/doit/tasks/main.yaml में doit

--- 
- name: "Check if we should continue" 
    shell: 
    echo $(($RANDOM % 2)) 
    register: check 
- debug: 
    var: check.stdout 
... 

और फिर भूमिका:

--- 
- hosts: all 
    remote_user: root 
    roles: 
    - check 
    - { role: doit, when: "check.stdout == '0'" } 
... 

तो roles/check/tasks/main.yaml में check भूमिका

--- 
- name: "Do it only on systems where check returned 0" 
    command: 
    date 
... 

और यह था ओ utput:

TASK [check : Check if we should continue] ************************************* 
Thursday 06 October 2016 21:49:49 +0200 (0:00:09.800)  0:00:09.832 ****** 
changed: [capsule.example.com] 
changed: [monitoring.example.com] 
changed: [satellite.example.com] 
changed: [docker.example.com] 

TASK [check : debug] *********************************************************** 
Thursday 06 October 2016 21:49:55 +0200 (0:00:05.171)  0:00:15.004 ****** 
ok: [monitoring.example.com] => { 
    "check.stdout": "0" 
} 
ok: [satellite.example.com] => { 
    "check.stdout": "1" 
} 
ok: [capsule.example.com] => { 
    "check.stdout": "0" 
} 
ok: [docker.example.com] => { 
    "check.stdout": "0" 
} 

TASK [doit : Do it only on systems where check returned 0] ********************* 
Thursday 06 October 2016 21:49:55 +0200 (0:00:00.072)  0:00:15.076 ****** 
skipping: [satellite.example.com] 
changed: [capsule.example.com] 
changed: [docker.example.com] 
changed: [monitoring.example.com] 

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

13

Ansible 2.2 में, आप meta मॉड्यूल के साथ end_play उपयोग कर सकते हैं:

- meta: end_play 

तुम भी सशर्त खेलने को समाप्त when निर्दिष्ट कर सकते हैं:

- meta: end_play 
    when: upgrading.stdout == "no" 

नोट, हालांकि, कि काम नहीं है उत्तर-प्लेबुक के आउटपुट में सूचीबद्ध नहीं है, इस पर ध्यान दिए बिना कि नाटक वास्तव में समाप्त होता है या नहीं। साथ ही, कार्य को रिकैप में गिना नहीं जाता है। तो, आप की तरह कुछ कर सकता है:

- block: 
    - name: "end play if nothing to upgrade" 
     debug: 
     msg: "nothing to upgrade, ending play" 

    - meta: end_play 
    when: upgrading.stdout == "no" 

जो सही यह समाप्त होने से पहले खेल खत्म होने की घोषणा करेंगे, केवल जब स्थिति उत्पन्न होने पर। यदि स्थिति पूरी नहीं हुई है, तो आपको end play if nothing to upgrade नामक कार्य को उचित रूप से छोड़ा जाएगा, जो उपयोगकर्ता को अधिक जानकारी प्रदान करेगा कि यह क्यों खेल है, या नहीं, समाप्त हो रहा है।

बेशक, यह केवल वर्तमान खेल को समाप्त करेगा और सभी प्लेबुक में शेष नाटकों को समाप्त करेगा।

+0

ग्रेट मिल! दुर्भाग्यवश, 'end_play' पूरी प्लेबुक समाप्त होती है, यहां तक ​​कि जब एक मुख्य प्लेबुक से उपयोग की जाने वाली उप प्लेबुक में उपयोग किया जाता है, उदाहरण के लिए 'Import_tasks'। – ssc

+0

@ssc आप आयात और प्लेबुक आयात कर रहे हैं। 'Import_tasks' निष्पादन एक ही खेल में रहता है इसलिए इसे उस आदेश के साथ समाप्त किया जाना चाहिए। इसके बजाय अलग playbook उपयोग 'import_playbook' कथन का आयात करने के लिए। –

संबंधित मुद्दे