2016-02-03 13 views
9

play_hosts ist eine Liste aller Maschinen für ein Spiel. Ich möchte diese nehmen und etwas wie format() verwenden, um sie wie [email protected]%s neu zu schreiben und dann sie zusammen mit etwas wie join() zu verbinden. Also:Jinja2: format + beitreten die Elemente einer Liste

Alle Beispiele des Formats verwenden Rohrleitungen, wo die Eingabe die Formatzeichenfolge und keine Liste ist. Gibt es eine Möglichkeit, diese (oder etwas anderes) zu nutzen, um das zu erreichen, was ich will? Die Ausgabe sollte in etwa so aussieht:

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

Das jinja2 doc-Format wie folgt beschreibt:

format(value, *args, **kwargs) 

Anwenden Zeichenfolge Python Formatierung auf ein Objekt:

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

es drei Arten So gibt der Eingabe, beschreibt aber nicht diese Eingaben in dem Beispiel, die eine in der Pipe und die anderen zwei über Args zeigt. Gibt es ein Schlüsselwort arg, um den String anzugeben, der piped ist? Bitte helfen, Python Mönche!

+0

würde diese Arbeit? (Ich habe noch nie jinja benutzt) '{% für host in play_hosts%}' '{{" rabbitmq @% s "| format (host)}}' '{% endfor%}' – Pynchia

+0

Scheint wie ein Listenverständnis ist alles du brauchst. – Barmar

Antwort

5

In ansible können Sie regex_replace Filter verwenden:

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

Sie benutzerdefinierte Filter erstellen können

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

und es verwenden,

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

Ich denke, das ist die beste Lösung. Dein Jinja2-Code wird schnell unhandlich, wenn du versuchst, alles innerhalb deines Playbooks zu machen. – rumdrums

+0

Eine solche 'format_list' sollte wirklich Teil von Jinja2 sein! – geekQ

4

Sie könnten einfach join nicht nur durch , sondern auch das Präfix hinzufügen, zusammen mit ihm. Nun, das ist nicht sehr pythonic oder anspruchsvoll, aber eine sehr einfache Arbeitslösung:

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

Wiederholung ist nicht nett, aber sieht sauberer als 'regex_replace' aus. Wirklich fehlt ein sauberer Filter in Jinja2. +1 für die Problemumgehung – geekQ

+0

Dies wird jedoch im Falle einer leeren Liste ein baumelndes 'rabbitmq @' hinterlassen. – lmNt

2

ich eine andere Art und Weise glauben, dass die joiner globale Funktion, wie Sie es verwenden kann in http://jinja.pocoo.org/docs/2.9/templates/#list-of-global-functions lesen:

ein Schreiner einen String übergeben wird und wird jedes Mal, wenn Zeichenfolge es heißt, mit Ausnahme der ersten Zeit zurückzukehren (in diesem Fall r erzeugt einen leeren String). Sie können diese Dinge verbinden verwenden

So würde Ihr Code so etwas wie:

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