2015-04-01 13 views
36

में set_facts और with_items का उपयोग करके मैं वर्तमान में उत्तर 1.7.2 का उपयोग कर रहा हूं। मेरे पास निम्न परीक्षण प्लेबुक है:Ansible

--- 
- hosts: localhost 
    tasks: 
    - name: set fact 1 
    set_fact: foo="[ 'zero' ]" 

    - name: set fact 2 
    set_fact: foo="{{ foo }} + [ 'one' ]" 

    - name: set fact 3 
    set_fact: foo="{{ foo }} + [ 'two', 'three' ]" 

    - name: set fact 4 
    set_fact: foo="{{ foo }} + [ '{{ item }}' ]" 
    with_items: 
     - four 
     - five 
     - six 

    - debug: var=foo 

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

PLAY [localhost] ************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [localhost] 

TASK: [set fact 1] ************************************************************ 
ok: [localhost] 

TASK: [set fact 2] ************************************************************ 
ok: [localhost] 

TASK: [set fact 3] ************************************************************ 
ok: [localhost] 

TASK: [set fact 4] ************************************************************ 
ok: [localhost] => (item=four) 
ok: [localhost] => (item=five) 
ok: [localhost] => (item=six) 

TASK: [debug var=foo] ********************************************************* 
ok: [localhost] => { 
    "foo": [ 
     "zero", 
     "one", 
     "two", 
     "three", 
     "six" 
    ] 
} 

PLAY RECAP ******************************************************************** 
localhost     : ok=6 changed=0 unreachable=0 failed=0 

कार्य 4 में with_items और तथ्य यह है कि उत्पादन ठीक से कि सूची में आइटम्स से अधिक दोहराया कार्य चलता देखते हुए, मैं सभी नंबरों को शामिल करने के लिए परिणाम की उम्मीद है | छह के माध्यम से शून्य। लेकिन वह अंतिम कार्य सूची में अंतिम आइटम के साथ केवल set_fact का मूल्यांकन करना प्रतीत होता है। क्या यह संभवतः उत्तर में एक बग है?

संपादित करें: मैंने अभी भी उत्तर 1.8 पर इसका परीक्षण किया और आउटपुट समान था।

+0

मेरे सबसे अच्छा अनुमान है कि ansible होगा '{{foo}} का मूल्यांकन करता है 'कार्य के निष्पादन के दौरान केवल एक बार' तथ्य तथ्य 'निर्धारित करता है। क्या आप यह समझना चाहते हैं कि दो सूचियों को कैसे मर्ज करना है या सिर्फ जिज्ञासा है? – Kashyap

+0

हाँ, ऐसा लगता है कि यह मामला है। नहीं, सिर्फ सूचियों को मर्ज करने की कोशिश नहीं कर रहा है। मैं गतिशील रूप से जेनरेट किए गए फ़ाइल नामों का ट्रैक रखने की कोशिश कर रहा हूं ताकि अन्य कार्य उनके माध्यम से पुनरावृत्त हो सकें। –

+0

ऐसा लगता है कि यह एक विशेषता है जो बहुत से लोगों की इच्छा है, और इसके लिए एक [पुल अनुरोध] (https://github.com/ansible/ansible/pull/8019) भी है, लेकिन यह किसी कारण से बाहर निकलता रहता है ... –

उत्तर

1

ऐसा लगता है कि इस व्यवहार की तरह यह है कि वर्तमान में उत्तरदायी कैसे काम करता है, हालांकि वांछित काम करने के लिए इसे ठीक करने में बहुत रुचि है। वांछित कार्यक्षमता के साथ वर्तमान में pull request है इसलिए आशा है कि यह अंततः Ansible में शामिल हो जाएगा।

57

एक कामकाज है जो मदद कर सकता है। आप प्रत्येक set_fact यात्रा के लिए परिणाम "रजिस्टर" हो सकता है और फिर उस सूची में परिणाम को मैप:

--- 
- hosts: localhost 
    tasks: 
    - name: set fact 
    set_fact: foo_item="{{ item }}" 
    with_items: 
     - four 
     - five 
     - six 
    register: foo_result 

    - name: make a list 
    set_fact: foo="{{ foo_result.results | map(attribute='ansible_facts.foo_item') | list }}" 

    - debug: var=foo 

आउटपुट:

< TASK: debug var=foo > 
--------------------- 
    \ ^__^ 
    \ (oo)\_______ 
     (__)\  )\/\ 
      ||----w | 
      ||  || 


ok: [localhost] => { 
    "var": { 
     "foo": [ 
      "four", 
      "five", 
      "six" 
     ] 
    } 
} 
+2

यह स्वीकार्य उत्तर होना चाहिए। –

+1

यह wil उत्तर v2 पर असफल हो जाता है। कोई विचार यह कैसे V2 पर काम करने के लिए? – DomaNitro

+0

ऐसा लगता है कि यदि आप अपने खेल में 'कब' जोड़ते हैं तो यह टूट जाता है। इसके बजाय, आपको 'परिणाम' मिलेगा जो आपको बताता है कि कुछ छोड़ दिया गया है।: -/ –

7

जिंजा 2.6 नक्शा समारोह नहीं है। तो ऐसा करने का एक वैकल्पिक तरीका होगा:

set_fact: foo="{% for i in bar_result.results %}{{ i.ansible_facts.foo_item }}{%endfor%}" 
3

अन्य लोगों की टिप्पणियों में उल्लेख किया है, शीर्ष समाधान यहाँ दी गई मेरे लिए काम नहीं कर रहा था Ansible 2.2 में, विशेष रूप से जब भी with_items का उपयोग कर।

ऐसा प्रतीत होता है कि ओपी का इरादा दृष्टिकोण अब item के उद्धरण में थोड़ा बदलाव के साथ काम करता है।

- set_fact: something="{{ something + [ item ] }}" 
    with_items: 
    - one 
    - two 
    - three 

और एक लंबे समय तक उदाहरण है जहाँ मैं इस सूची के प्रारंभिक मामला संभाला है अपरिभाषित जा रहा है और कहा कि एक वैकल्पिक when कि क्योंकि मुझे भी पैदा कर रहा था दु: ख:

- set_fact: something="{{ something|default([]) + [ item ] }}" 
    with_items: 
    - one 
    - two 
    - three 
    when: item.name in allowed_things.item_list