2016-07-07 13 views
0

Mit Wörterbuch (definiert in map.jinja)filtern Schlüssel aus Wörterbuch

{% set intellij = salt['grains.filter_by']({ 
    'default': { 
     'orig_name': 'idea-IC-145.1617.8', 
     'download_url': 'www.example.com',   
     'archive_format': 'tar', 
     'archive_opts': 'xfz', 
     'owner': 'root', 
     'owner_link_location': '/blabla/bin/idea', 
    }, 
}, merge=salt['pillar.get']('intellij')) %} 

und einige Funktionsdefinition Argumente fast die gleiche wie die Wörterbuch der Tasten (nehmen wir an, die „Funktion“ ist eigentlich ein Makro zu akzeptieren)

{% macro some_macro(state_id, orig_name, download_url, archive_format, owner, archive_opts=None) %} 

ich mag würde einige Schlüssel, um herauszufiltern, so dass ich es so nennen kann:

{{ some_macro('some_state', **intellij) }} 

Ich habe verschiedene Konstrukte versucht, wie:

{{ some_macro('intellij', **(intellij|rejectattr("owner_link_location"))) }} 

, die auch nicht funktionieren

Jinja error: call() argument after ** must be a mapping, not generator 

Dict Verständnis (statt jinja Filter) ergibt.

Wie erreicht man die oben genannte Funktionalität (Herausfiltern des Schlüssels oder zumindest Aufruf der Funktion mit "extrahiertem" und gefiltertem Wörterbuch in übersichtlicher Form)?

+0

es scheint, dass die Definition von ‚some_macro‘ ist nicht im Einklang mit, wie Sie es nennen. Können Sie den Inhalt Ihrer Pillar-Datei einfügen, um mehr Details zu erhalten? –

+0

Säule ist leer und überschreibt nichts. Ich habe Tippfehler in Frage gestellt, danke! – lakier

+0

Es scheint, dass rejectattr nur zum Filtern von Listen verwendet werden kann, aber "intellij" ist Mapping. Wenn Sie nur die Schlüssel filtern wollen, dann definieren Sie das Makro einfach als '' 'some_macro (state_id, orig_name, download_url, archive_format, owner, archive_opts = None, owner_link_location = None)' '' –

Antwort

0

Das Problem, das aufgetreten ist, wird beschrieben here.
Es gibt einen Trick zu arbeiten, der mir gut aussieht.

{% macro some_macro(state_id, orig_name, download_url, archive_format, owner, archive_opts=None) -%} 
{% if kwargs | length >= 0 -%} 
// implement your macro definition here 
{% endif -%} 
{% endmacro -%} 

Der Punkt ist, dass Sie kwargs anrufen, wenn Sie alle Variablen in Zuordnung nicht konsumieren haben.

Dann rufen Sie das Makro wie:

{{ some_macro('some_state', **intellij) }} 
Verwandte Themen