如何在saltstack中从柱子中生成过滤列表

时间:2018-02-15 18:43:12

标签: jinja2 salt-stack

我有一些主机名支柱数据

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 %}

但是有没有办法创建这个过滤列表(???)?

2 个答案:

答案 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 %}