Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

Advanced Use of jinja2 for Templates

1.480 Aufrufe

Veröffentlicht am

Take a practical dive into advanced use of the Jinja2 templating language as implemented in the Ansible core template module.

Veröffentlicht in: Internet
  • Hey guys! Who wants to chat with me? More photos with me here 👉 http://www.bit.ly/katekoxx
       Antworten 
    Sind Sie sicher, dass Sie …  Ja  Nein
    Ihre Nachricht erscheint hier

Advanced Use of jinja2 for Templates

  1. 1. @KeithResar
  2. 2. @KeithResar
  3. 3. <b>From:</b> Pro-Speller &lt;noreply@pro-speller.com&gt; <br><b>Date:</b> %{{exec("%s" % ((datetime.today() - timedelta(minutes = 47)).strftime("%A, %B %e, %Y at %l:%M %p")))}}% <br><b>To:</b> Andrea Jacobs &lt;Andrea.Jacobs@pro-speller.com&gt; <br><b>Subject:</b> Your Scan Results - %{{url_f}}% <br>
  4. 4. %{{INNER_TPL}}% <tr style="%{{style( ('miss_tr',) )}}%"> <td colspan="2" style="%{{style( ('miss_td',) )}}%"> <div style="%{{style( ('word_div',) )}}%"> <span style="%{{style( ('word_span',) )}}%">%{{INNER.WORD}}%</span> &nbsp;: &nbsp; <span>%{{INNER.SUGGESTIONS}}%</span> </div> <div style="%{{style( ('suggestions_div',) )}}%"> <span>%{{INNER.CONTEXT}}%</span> </div> </td> </td> %{{ENDINNER_TPL}}%
  5. 5. > perl -p -i -e 's/^PermitRootLogin .*/PermitRootLogin no' sshd_config
  6. 6. https://github.com/pallets/jinja#philosophy
  7. 7. {% extends "layout.html" %} {% block body %} <ul> {% for user in users %} <li><a href="{{ user.url }}">{{ user.username }}</a></li> {% endfor %} </ul> {% endblock %}
  8. 8. Sandboxed Execution Mode Every aspect of the template execution is monitored and explicitly whitelisted or blacklisted, whatever is preferred. This makes it possible to execute untrusted templates. Template Inheritance Makes it possible to use the same or a similar layout for all templates. Easy to Debug With a debug system that integrates template compile and runtime errors into the standard Python traceback system. Configurable Syntax For instance you can reconfigure Jinja2 to better fit output formats such as LaTeX or JavaScript. (skipped the features more relevant to high-volume usage such as in Django)
  9. 9. Accepts any text file type text, xml, html, etc Convention is to name files with .j2 extension http.conf.j2, sshd_config.j2 Convention to place in the templates/ directory templates/http.conf.j2, templates/sshd_config.j2
  10. 10. {{ ... }} {% ... %} {# ... #}
  11. 11. Accessing Ansible variables like {{ ansible_hostname }} {{ ansible_date_time.epoch }} We can do math like {{ 1+3 }} Standard data types, like my list: {{ ('a','b','c') }} We can call standard methods associated with our types: {{ "lorem ipsum".upper() }} {{ ['a','b','c'].pop() }}
  12. 12. Inline Conditionals: {{ '[%s]' % page.title if page.title }} Built-in Filters: {{ my_var | default('my_var undefined') }} Maths: abs, int, float, round, sum Str: capitalize, length, center, escape, lower, regex Lists: join, last, sort, shuffle, json_query
  13. 13. Loops: <ul> {% for href, caption in my_list }} <li><a href="{{ href }}">{{ caption }}</a></li> {% endfor %} </ul> Conditionals: {% if kenny.sick %} Kenny is sick. {% elif kenny.dead %} You killed Kenny! You bastard!!! {% else %} Kenny looks okay --- so far {% endif %}
  14. 14. {# Note: Nothing in the comment will be included in the template output {% for user in users %} ... {% endfor %} #}
  15. 15. {"changed": false, "failed": true, "msg": "AnsibleUndefinedVariable: 'my_var' is undefined"} {"changed": false, "failed": true, "msg": "AnsibleError: template error while templating string: expected token 'end of print statement', got '...' String: <...>"}
  16. 16. Include as first line in the template file:
  17. 17. {% include "file1.j2" %} {% include ['file1.j2', 'file2.j2'] %}
  18. 18. Alternation: {% for row in rows %} <li class="{{ loop.cycle('odd', 'even') }}">{{ row }}</li> {% endfor %} Empty Lists: <ul> {% for user in users %} <li>{{ user.username|e }}</li> {% else %} <li><em>no users found</em></li> {% endfor %} </ul>
  19. 19. Sort by Attribute: {% for item in iterable|sort(attribute='date') %} ... {% endfor %} Group by Attribute: {% for group in persons|groupby('gender') %} <li>{{ group.grouper }}<ul> {% for person in group.list %} <li>{{ person.first_name }}</li> {% endfor %}</ul></li> {% endfor %}
  20. 20. @KeithResar @KeithResar

×