关于jinja2:如何在SaltStack中呈现具有特定.sls或state的minion的ID?

How can I render the ID of a minion that has a particular .sls or state in SaltStack?

我用saltstack管理一些虚拟机。我正在寻找一种方法来呈现一个在top.sls文件中附加了一个指定.sls的迷你的ID/主机名,或者在一个启用了jinja模板的文件中附加了一个特定的状态。我之所以要这样做,是因为我可以方便地引用客户机配置中的服务器,而不必在任何地方硬编码值。例如;

/srv/salt/top.sls:

1
2
3
4
5
6
base:
  'desktoppc01':
    - generic.dns
  'bind9server01':
    - generic.dns
    - bind9

/srv/salt/generic/dns/init.sls:

1
2
3
4
5
6
/etc/resolv.conf:
  file:
    - managed
    - source: salt://generic/dns/files/resolv.conf
    - mode: 644
    - template: jinja

最后,

/srv/salt/generic/dns/files/resolv.conf:

1
2
3
domain {{ pillar['domain_name'] }}
search {{ pillar['domain_name'] }}
nameserver {{ list_minions_with_state['bind9'] }}

我特别想要的是一个相当于{{ list_minions_with_state['bind9'] }}的东西(我只是为了演示而编的)。我本以为这是一个非常普遍的需要,但在浏览完模块页面后,我还没有找到任何东西。

目前,我让客户机从一个支柱获取信息,但这必须手动配置,这让人觉得时间花得不好。

我希望我可以用一个for循环来扩展这个想法,以便在创建服务器时动态地添加它们。

编辑:

使用与top.sls具有相同数据和层次结构的文件,呈现

1
2
3
4
5
6
7
base:
{% for server_id in salt['pillar.get']('servers') %}
  '{{ server_id }}':
{% for states in salt['pillar.get']('servers:{{ server_id }}') %}
    - {{ states }}
{% endfor %}
{% endfor %}

给你

1
2
3
4
5
base:

  'desktoppc01':

  'bind9server01':

我在{{ server_id }}上尝试了一些变化,但没有成功。除非有一种简单的方法可以在函数中使用支柱变量,否则我正在考虑提出一个特性请求并将其称为一天。


我认为解决这个问题的方法是使用jinja并有一个包含DNS服务器列表的变量…由支柱变量填充

例如,您可以有一个支柱:bind:servers变量请参阅http://docs.saltstack.com/en/latest/topics/tutorials/states pt3.html和http://docs.saltstack.com/en/latest/topics/pillar/index.html master config in pillar

可用于设置resolv.conf.的名称服务器。也可以将-bind9状态添加到服务器。所以最后你只有一个地方可以编辑:在Pillar中绑定服务器的迷你列表


首先想到的是使用测试状态方法,为state.apply或state.highstate设置test=true。如果要应用零状态,那么您的服务器将完全应用HighState或特定的SLS。

1
    salt '*' state.highstate test=True

使用salt run的survey.diff可能会有所帮助(尽管diff补丁在这种情况下不适合于检查配置文件):

1
    salt-run survey.diff '*' state.apply my.state test=True

虽然目前不适用于基于实例的问题,但另一个让人想到的方法是在州内使用盐粒。当您将状态应用到系统时,状态将附加到"状态"纹理。Grains跟踪诸如角色之类的东西(如Web、数据库等),在您的案例中,Grains可以更多地跟踪应用的状态,而不是角色的逻辑。然后您可以使用它们来定位和/或查询您的服务器。

按纹理定位(仅显示迷你ID):

1
2
3
    salt -G 'states:bind9' test.ping
    salt -G 'states:generic.dns' test.ping
    salt -G 'states:my_jinja_state' test.ping

查询谷物(对于每个迷你,显示状态谷物):

1
    salt '*' grains.get states

晶粒的差异(比较每一个小子的状态晶粒):

1
    salt-run survey.diff '*' grains.get states