我正在将一些模块从 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 分配给顶部文件中的节点,因为按照您现在设置的方式,每个节点都会在 node/
目录下获得每个 SLS 的副本,其中运行状态的逻辑在 SLS 本身中进行编码。考虑到您可以在 top.sls
中执行所有这些逻辑和正则表达式相关的匹配,这对我来说似乎有点困惑。
everytime I add some node in salt, I just need to create a new file under the node directory.
好的,您只需使用 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
状态文件。 注意您的匹配
可以使用 salt 允许的任何类型的正则表达式或复合匹配:http://docs.saltstack.com/en/latest/topics/targeting/
关于regex - salt-stack 中的正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27916765/