我正在重写一些从 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/