2017-07-24 4 views
0

Ich habe eine Methode untersucht, um jinja2-Vorlagen manuell zu rendern, die ich für ansible benötige.jinja2 python render "for loop"

Dies brachte mich zu den Python Jinja Render-Funktionalität, aber leider ist meine Python fast nicht existent.

jedoch die Beispielskripts mit Google-Suche gefunden aussehen ziemlich einfach (auf den ersten Blick)

Meine Vorlage enthält eine for-Schleife und das ist, wo ich einige Schwierigkeiten gestoßen sind.

jinja2 Vorlage:

{% if extendedKeyUsage is defined and extendedKeyUsage %} 
subjectAltName = {% for SAN_IP in TLS_IP_SANS %}IP:{{ SAN_IP }}, {% endfor %}{% for SAN_DNS in TLS_DNS_SANS %}DNS:{{ SAN_DNS }}, {% endfor %}IP:127.0.0.1 
extendedKeyUsage = clientAuth,serverAuth 
{% endif %} 

Wie Sie sehen, ich versuche, eine openssl erweiterte Nutzungen Datei aus der Vorlage zu erzeugen. (Aber das ist nebensächlich)

Skript:

#!/usr/bin/python 

# 
# stolen from https://stackoverflow.com/questions/42090084/how-can-i-unit-test-jinja2-template-logic 
# but real working info found here: http://matthiaseisen.com/pp/patterns/p0198/ 
# 


import os 
import jinja2 


def render(tpl_path, context): 
    path, filename = os.path.split(tpl_path) 
    return jinja2.Environment(
     loader=jinja2.FileSystemLoader(path or './') 
    ).get_template(filename).render(context) 


context = { # your variables to pass to template 
    'extendedKeyUsage': 'true', 
    'TLS_IP_SANS': '10.1.17.101', 
# 'TLS_DNS_SANS': 'test.crapco.labs' 
    'TLS_DNS_SANS': 'test.crapco.labs, www.crapco.labs, a.crapco.lab' 
} 

filename = '/root/20160921/roles/ansible-role-CA/templates/crtExtendedUse.j2' 

rendered = render(filename, context) 

print "this is the rendered template %s." % rendered 

Ach, anstatt die durch Komma getrennt Werte im Kontext für die for-Schleife, scheint es, jedes Zeichen zu nehmen.

Ergebnis:

[[email protected] ansible-role-CA]# ./render_jinja2.py 
this is the rendered template 
subjectAltName = IP:1, IP:0, IP:., IP:1, IP:., IP:1, IP:7, IP:., IP:1, IP:0, IP:1, DNS:t, DNS:e, DNS:s, DNS:t, DNS:., DNS:c, DNS:r, DNS:a, DNS:p, DNS:c, DNS:o, DNS:., DNS:l, DNS:a, DNS:b, DNS:s, DNS:,, DNS: , DNS:w, DNS:w, DNS:w, DNS:., DNS:c, DNS:r, DNS:a, DNS:p, DNS:c, DNS:o, DNS:., DNS:l, DNS:a, DNS:b, DNS:s, DNS:,, DNS: , DNS:a, DNS:., DNS:c, DNS:r, DNS:a, DNS:p, DNS:c, DNS:o, DNS:., DNS:l, DNS:a, DNS:b, IP:127.0.0.1 
extendedKeyUsage = clientAuth,serverAuth 
. 

Wie kann ich die kompletten Strings bekommen?

+0

Es ist mein Verständnis einer Liste erscheint, ist fehlerhaft. und die Verwendung von [] löst das Problem korrekt ... wie: ''TLS_DNS_SANS': ['test.crapco.labs', 'www.crapco.labs', 'a.crapco.lab']' – lievendp

Antwort

0

Die Antwort ist mein fehlerhaftes Verständnis von was ist eine Liste/Array zu umschlingen. mit dem folgenden für Kontext funktionierte gut:

context = { # your variables to pass to template 
    'extendedKeyUsage': 'true', 
    'TLS_IP_SANS': ['10.1.17.101'], 
    'TLS_DNS_SANS': ['test.crapco.labs', 'www.crapco.labs', 'a.crapco.lab'] 
} 

jetzt Ausgang wie erwartet:

this is the rendered template 
subjectAltName = IP:10.1.17.101, DNS:test.crapco.labs, DNS:www.crapco.labs, DNS:a.crapco.lab, IP:127.0.0.1 
extendedKeyUsage = clientAuth,serverAuth 
.