2016-02-03 27 views
9

play_hosts, bir oyun için tüm makinelerin listesidir. Bunları alıp format() gibi bir şey kullanarak [email protected]%s gibi yeniden yazmak ve daha sonra join() gibi bir şeyle birleştirmek istiyorum. Bu nedenle: girişin biçim dizesi olduğu bir liste değil, tüm biçim örnekleri boruları kullanın. İstediğimi gerçekleştirmek için bunları (veya başka bir şeyi) kullanmanın bir yolu var mı? jinja2 doc böyle biçimini tarif ederJinja2: format + listeye üye olun

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

: Yani üç çeşit verir

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

:

format(value, *args, **kwargs) 

bir nesne üzerinde biçimlendirme piton dizesini uygulayın çıkış gerektiği gibi görünür girdi, ancak bu örnekte, borudaki ve diğer ikisinin de args yoluyla geçtiğini gösteren girişleri açıklamıyor. Borulu dizeyi belirtmek için bir anahtar kelime arg var mı? Lütfen yardım edin python rahipleri! Sen özel filtre

# /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, 
     } 

oluşturmak ve

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

olur bu işin? (Hiç jinja kullanmamıştım) '{play_hosts% 'da host için%}' '{{" rabbitmq @% s "| biçim (host)}}' {% {endfor%}} – Pynchia

+0

Liste kavramasının tümü gibi görünüyor ihtiyacın var. – Barmar

cevap

5

: Başka bir yolu, senin gibi joiner küresel işlevini kullanarak olacağını düşünüyoruz

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

. Şimdi bu değil çok pythonic ya da sofistike ama çok basit bir çalışma çözüm:

Eğer regex_replace filtre kullanabilirsiniz yanıtlayıcı 'in
[[email protected]{{ play_hosts | join(', [email protected]') }}] 
+0

Bence bu en iyi çözüm. Eğer oyun kitabında her şeyi yapmaya çalışırsanız Jinja2 kodunuz hızlı bir şekilde hantal hale gelir. – rumdrums

+0

Böyle 'format_list' gerçekten Jinja2 parçası olmalıdır! – geekQ

4

Sadece join, tarafından değil, aynı zamanda sadece onunla birlikte önek ekleyebilirsiniz kullanabilirsiniz

+0

Tekrarlama güzel değil, "regex_replace" den daha temiz görünüyor. Gerçekten jinja2'de temiz bir filtre eksik. Geçici çözüm için +1, – geekQ

+0

Bu, boş bir liste durumunda sarkan bir “rabbitmq @” bırakacaktır. – lmNt

2

http://jinja.pocoo.org/docs/2.9/templates/#list-of-global-functions okuyabilirsiniz:

bir marangoz bu durumda o r (bir dize geçirilir ve ilk kez hariç, o dize denir her zaman dönecektir boş bir dize döndürür). Bu şeyler

katılmak için kullanabilecekleri Yani kod olurdu gibi bir şey:

[ 
{% set comma = joiner(",") %}  
{% for host in play_hosts %} 
    {{ comma() }} 
    {{ "[email protected]%s"|format(host) }} 
{% endfor %} 
]