2016-02-09 4 views
5

शामिल हैं।Jinja2 फिल्टर स्ट्रिंग का उपयोग सूची मैं Jinja2 में ansible में एक सूची फिल्टर करने के लिए जब तत्वों एक स्ट्रिंग शामिल कोशिश कर रहा हूँ, लेकिन जिंजा प्रलेखन पर्याप्त स्पष्ट प्रतीत नहीं होता है मुझे यह पता लगा लिए परीक्षण

यह वही है मैं अब तक है:

- name: run script 
    command: /usr/tmp/run_script.py 
    register: script_results 

- name: display run info 
    debug: 
    var: "{{script_results.stdout_lines | select(\"'running script' in script_results.stdout_lines\") }}" 

लेकिन सभी मैं त्रुटि है:

"<generator object _select_or_reject at 0x13851e0>": "VARIABLE IS NOT DEFINED!" 

उदाहरण के लिए, यदि stdout_lines["apples","running script one","oranges","running script two"] होता है, मैं

प्रिंट करना चाहते हैं
running script one 
running script two 

वे documentation for select और documentation for built-in-tests है, लेकिन वे "इन" परीक्षण प्रदर्शित नहीं करते हैं, और मुझे नहीं पता कि वे इस उत्तर परिवर्तनीय के संदर्भ में कैसे काम करते हैं।

मैं इस तरह इसे सुलझाने की कोशिश की:

- name: display run info 
    debug: 
    var: item 
    with_items: "{{script_results.stdout_lines}}" 
    when: "'running script' in item" 

लेकिन प्रदर्शित करता है हर पंक्ति के लिए "लंघन" कि परीक्षा उत्तीर्ण नहीं कर रहा है ... थोड़े उद्देश्य को हराने कि!

उत्तर

4

मैं समझता हूँ कि एक से अधिक तरीका यह है हो सकता है। क्या यह आपके लिए काम करेगा?

- debug: var={{item}} 
    when: item.find('running script') > -1 
    with_items: script_results.stdout_lines 
+0

यह हर के लिए एक लाइन प्रिंट आइटम, जो दुर्भाग्य से उद्देश्य धरा को छोड़ दिया। – CorayThan

10

select फ़िल्टर एक और फ़िल्टर लेगा। odd दस्तावेज़ों की तरह, जो सूची के केवल विषम तत्वों को वापस लाएगा। फ़िल्टर select को equalto के साथ जोड़ना चाहते हैं।

अब यह बात है। Ansja bundles Jinja2 का एक बहुत पुराना संस्करण है, जिसमें बस equalto फ़िल्टर नहीं है। हां, यह तब तक बेकार है जब तक कि आप विषम तत्वों को फ़िल्टर नहीं करना चाहते हैं। (जो कोई भी इतिहास में अब तक चाहता था ...)

इसके अलावा मैं अभी तक कस्टम फ़िल्टर प्लगइन्स Ansible 2 में काम करते हैं तो आप काफी एक साथ कुछ बदसूरत हैक करने के लिए मजबूर कर रहे हैं करने में असमर्थ था।

helloV पहले से ही एक विकल्प दिखाया। यहाँ एक और विचार है:

- name: run script 
    shell: /usr/tmp/run_script.py | grep "running script" 
    register: script_results 

अद्यतन:

मैं हाल ही में (Ansible से नहीं एक मानक Jinja2 फिल्टर लेकिन जोड़ा) आप match उपयोग कर सकते हैं की खोज की एक साथ select साथ। eualto फ़िल्टर प्लस के लिए एक अच्छा प्रतिस्थापन है, आप नियमित अभिव्यक्तियों का उपयोग कर सकते हैं। यह काम करना चाहिए:

{{ script_results.stdout_lines | select("match", ".*running script.*") }} 
+0

मैं इस समाधान का उपयोग करता, लेकिन मैं वास्तव में अपने खेल में कहीं और लिपि के पूर्ण आउटपुट का उपयोग करता हूं। मुझे लगता है कि मैं script_results को grep में पास करने में सक्षम हूं और इस तरह एक दूसरा चर पंजीकृत कर सकता हूं, लेकिन मैंने इसके बजाय सीधे-अप पायथन मार्ग पर जाने का निर्णय लिया। – CorayThan

+0

@ कोरयहान मैंने अपना जवाब अपडेट किया। अब मुझे 'बराबर' फ़िल्टर के लिए एक अच्छा प्रतिस्थापन मिला है। – udondan

+0

धन्यवाद @ubondan जो वही था जो मैं खोज रहा था। क्या नवीनतम उत्तरदायी रिलीज के साथ किसी भी मौके से कुछ बदल गया? –

0

मैं एक अजगर स्क्रिप्ट लिखने यह करने के लिए समाप्त हो गया है, क्योंकि मैं ansible या प्राचीन-jinja2 कटौती बनाने के लिए नहीं मिल सका।

Ansible कार्यों:

- name: gather run info 
    command: "{{role_path}}/files/print_results.py {{script_results.stdout_lines}}" 
    register: script_print_results 
    delegate_to: 127.0.0.1 
    run_once: true 

- name: display run info 
    debug: 
    var: script_print_results.stdout_lines 
    delegate_to: 127.0.0.1 
    run_once: true 

पायथॉन लिपि:

for result_line in sys.argv[1:]: 
    if "running script:" in result_line: 
     print result_line[1:-1] 
संबंधित मुद्दे