我正在重写一些从 puppet 到 saltstack 的模块。

在 puppet 中我们可以使用 node 来指定这部分是针对这台机器的,
例如:

node /william\d+.aws.dev/ {
  # some codes here..
}

但是在 saltstack 中,它并没有那么优雅:
{% if grains['fqdn'] == 'william.aws.dev' %}
  # some codes here..
{% endif %}

并且不支持正则表达式。

有什么方法可以使用更少的代码在 saltstack 中重写它吗?

注意 我不想用 top.sls 来定义哪个节点使用哪个 sls。因为它会使 top.sls 文件太大而无法维护。

我只想在 top.sls 中定义一个简单的两行:
'*':
  - node.*

每次我在 salt 中添加一些节点时,我只需要在 node 目录下创建一个新文件。

最佳答案

我仍然建议将 SLS 分配给您的 topfile 中的节点,仅仅因为您现在设置它的方式,每个节点都会获得 node/ 目录下每个 SLS 的副本,并在 SLS 中编码运行哪些状态的逻辑他们自己。考虑到您可以在 top.sls 中进行所有这些逻辑和与正则表达式相关的匹配,这对我来说似乎有点困惑。



好的,您可以通过仅使用 top.sls 来获得此功能,同时仍将其保持在可管理的大小。似乎您的意图是让每个节点获得自己的 SLS 文件,并将节点分配给与其 fqdn 匹配的 SLS。如果是这样的话,那么看看这个例子 top.sls ,从 salt grains documentation 调整

{% set grain_fqdn = salt['grains.get']('fqdn', '') %}

base:
  'fqdn:{{ grain_fqdn }}':
      - match: grain
      - node.{{ grain_fqdn }}

这将确保带有grain fqdn = williams.aws.dev 的节点被分配了node.williams.aws.dev.sls 状态文件。 注意 你的 match 可以使用任何类型的正则表达式或盐允许的复合匹配:http://docs.saltstack.com/en/latest/topics/targeting/

10-08 20:12