2016-02-03 7 views
9

play_hosts एक नाटक के लिए सभी मशीनों की एक सूची है। मैं इन्हें लेना चाहता हूं और format() जैसे [email protected]%s जैसे उन्हें फिर से लिखने के लिए कुछ उपयोग करना चाहता हूं और फिर join() जैसे कुछ के साथ उनसे जुड़ना चाहता हूं। तो:जिनजा 2: प्रारूप + सूची के आइटम में शामिल हों

{{ play_hosts|format(???)|join(', ') }} 

प्रारूप के सभी उदाहरण पाइपिंग का उपयोग करते हैं जहां इनपुट प्रारूप स्ट्रिंग है और सूची नहीं है। क्या मैं चाहता हूं कि पूरा करने के लिए इन (या कुछ और) का उपयोग करने का कोई तरीका है? jinja2 दस्तावेज़ इस तरह प्रारूप का वर्णन करता है

['[email protected]', '[email protected]', [email protected]', ...] 

:

{{ "%s - %s"|format("Hello?", "Foo!") }} 
-> Hello? - Foo! 

तो यह तीन प्रकार देता है:

format(value, *args, **kwargs) 

एक वस्तु पर स्वरूपण अजगर स्ट्रिंग लागू उत्पादन करना चाहिए तरह दिखता है इनपुट लेकिन उदाहरण में उन इनपुट का वर्णन नहीं करता है, जो पाइप में एक दिखाता है और अन्य दो तर्कों के माध्यम से पारित होते हैं। क्या पाइप किए गए स्ट्रिंग को निर्दिष्ट करने के लिए कोई कीवर्ड तर्क है? कृपया मदद करें, अजगर भिक्षुओं!

+0

होगा यह काम? (मैंने कभी जिन्जा का उपयोग नहीं किया है) '{_% play_hosts%} में मेजबान के लिए '' {{"rabbitmq @% s" | प्रारूप (होस्ट)}} '' {% endfor%} ' – Pynchia

+0

एक सूची समझ की तरह लगता है आप की जरूरत है। – Barmar

उत्तर

5

ansible आप regex_replace फिल्टर का उपयोग कर सकते हैं:

{{ play_hosts | map('regex_replace', '^(.*)$', '[email protected]\\1') | list} 
6

आप कस्टम फ़िल्टर

# /usr/share/ansible/plugins/filter/format_list.py (check filter_plugins path in ansible.cfg) 

def format_list(list_, pattern): 
    return [pattern % s for s in list_] 


class FilterModule(object): 
    def filters(self): 
     return { 
      'format_list': format_list, 
     } 

बनाने और उपयोग यह

{{ play_hosts | format_list('[email protected]%s') }} 
+0

मुझे लगता है कि यह सबसे अच्छा समाधान है। यदि आप अपनी प्लेबुक में इसे करने का प्रयास करते हैं तो आपका जिन्जा 2 कोड जल्दी से अनावश्यक हो जाएगा। – rumdrums

+0

ऐसी 'format_list' वास्तव में Jinja2 का हिस्सा होना चाहिए! – geekQ

4

आप बस join, द्वारा लेकिन यह भी न केवल उपसर्ग एक साथ इसके साथ जोड़ सकता है कर सकते हैं। अब जब कि नहीं बहुत pythonic या परिष्कृत लेकिन एक बहुत ही सरल काम कर समाधान है:

[[email protected]{{ play_hosts | join(', [email protected]') }}] 
+0

पुनरावृत्ति अच्छा नहीं है, लेकिन 'regex_replace' से क्लीनर दिखता है। वास्तव में जिन्जा 2 में एक साफ फिल्टर याद आ रही है। वर्कअराउंड – geekQ

+0

के लिए +1 यह खाली सूची के मामले में एक खतरनाक 'rabbitmq @ 'छोड़ देगा। – lmNt

2

मेरा मानना ​​है कि एक और तरीका joiner वैश्विक फ़ंक्शन का उपयोग किया जाएगा, आप के रूप में http://jinja.pocoo.org/docs/2.9/templates/#list-of-global-functions में पढ़ सकते हैं:

एक योजक एक स्ट्रिंग पारित कर दिया है और कहा कि स्ट्रिंग हर बार यह कहा जाता है वापस आ जाएगी, पहली बार को छोड़कर (इस स्थिति में यह r एक खाली स्ट्रिंग eturns)। आप इस बातें

शामिल होने के लिए उपयोग कर सकते हैं की तरह कुछ तो अपने कोड होगा:

[ 
{% set comma = joiner(",") %}  
{% for host in play_hosts %} 
    {{ comma() }} 
    {{ "[email protected]%s"|format(host) }} 
{% endfor %} 
] 
संबंधित मुद्दे