我有一些主机名支柱数据
my_hosts:
a.example.com:
include_me: true
b.example.com:
include_me: false
c.example.com:
include_me: true
d.example.com:
include_me: false
我想构建一个按可变条件过滤的主机名列表(这里简单来说,include_me
)。所以输出应该是一个类似
{% set interesting_hosts = ??? %} # == [a.example.com, c.example.com]
这样我就可以有一些规则
{% for a_host in in interesting_hosts %}
/var/cool/stuff]{{ a_host }}:
file.managed:
... something cool ...
{% endfor %}
但是有没有办法创建这个过滤列表(???
)?
答案 0 :(得分:1)
当然有这样的选择。
您是否阅读了jinja filters手册?
Jinja 种类支持列表映射/类似过滤器的操作
确保您的jinja2至少为2.9版本(pip install --upgrade Jinja2
)
由于dict过滤是单调乏味且无法读取的,如果你可以将你的支柱格式化为一个dicts列表,如下所示:
my_hosts:
- host: a.example.com
include_me: True
- host: b.example.com
include_me: False
- host: c.example.com
include_me: True
- host: d.example.com
include_me: False
然后设置有趣的主机就像:
{% set my_hosts = salt['pillar.get']("my_hosts") %}
{% set interesting_hosts = my_hosts|selectattr("include_me", "equalto", True)|map(attribute="host")|list %}
答案 1 :(得分:0)
您可以在列表中分配您的主机,如下例所示:
{% load_yaml as interesting_hosts %}
- a.example.com
- b.example.com
- c.example.com
- d.example.com
{% endload %}
{% load_yaml as not_interesting_hosts %}
- e.example.com
{% endload %}