有字典(在 map.jinja 中定义)
{% 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')) %}
和一些函数定义接受的参数几乎与字典的键相同(让我们假设"函数"实际上是一个宏)
{% macro some_macro(state_id, orig_name, download_url, archive_format, owner, archive_opts=None) %}
我想过滤掉一些键,以便我可以像这样调用它:
{{ some_macro('some_state', **intellij) }}
我尝试了各种结构,例如:
{{ some_macro('intellij', **(intellij|rejectattr("owner_link_location"))) }}
产生
Jinja error: call() argument after ** must be a mapping, not generator
Dict-comprehension(而不是jinja过滤器)也不起作用。
如何实现上述功能(过滤掉键或至少使用&#34调用函数;提取"以简洁的方式过滤字典)?
答案 0 :(得分:0)
您遇到的问题描述为here 有一个解决方法,对我来说很好。
{% 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 -%}
关键是如果您没有使用映射中的所有变量,则必须调用kwargs
。
然后将您的宏称为:
{{ some_macro('some_state', **intellij) }}