我的SaltStack Pillar中具有以下YAML:
prometheus:
services:
cassandra:
enabled: False
cockroachdb:
enabled: True
haproxy:
enabled: True
swift:
enabled: False
我希望能够遍历已启用服务的列表。
{% for enabled_service_name in prometheus.services | selectattr('enabled') %}
{{ enabled_service_name }}
{% endfor %}
但是,这不起作用,因为我要过滤的属性位于服务名称下方的嵌套字典中:
{'cassandra': {'enabled': False},
'cockroachdb': {'enabled': True},
'haproxy': {'enabled': True},
'swift': {'enabled': False}}
通过在循环中应用条件测试,我显然可以实现我想要的目标:
{% for name, properties in prometheus.services | dictsort %}
{% if properties.enabled %}
configuration for {{ name }}
{% endif %}
{% endfor %}
但是,我经常会遍历此列表,并希望Jinja在for循环中内联应用过滤器。
有没有一种方法可以根据嵌套字典中的项目值进行过滤?
答案 0 :(得分:2)
好吧,我认为在这种情况下yaml文件的结构越好,解决问题所需的选项就越多。
我建议进行以下重组:
prometheus:
services:
- name: cassandra
enabled: False
- name: cockroachdb
enabled: True
- name: haproxy
enabled: True
- name: swift
enabled: False
然后您可以用不同的方式进行迭代,这可能是一种方式:
{{ prometheus.services | selectattr('enabled', True) | map(attribute='name') | list }}
我希望这会有所帮助!
答案 1 :(得分:0)
在不更改支柱结构的情况下,您可以通过groupby
将列表分为两组。
{% for group in prometheus.services.items() | groupby ('1.enabled') %}
{% if group.grouper = True %}
{% set enabled_services = group.list %}
{% else %}
{% set disabled_services = group.list %}
{% endif %}
{% endfor %}
它看起来有些复杂,但是如果您需要遍历两个列表,则很有用。