我正在查看 Puppet Forge 上的 OpenStack 模块。这些模块使用“资源收集器”,所以我在这里阅读“资源收集器”:https://docs.puppet.com/puppet/latest/reference/lang_collectors.html
我仍然不明白为什么需要使用资源收集器?
这是 OpenStack/puppet-keystone 模块使用资源收集器的示例:
if !is_service_default($memcache_servers) or !is_service_default($cache_memcache_servers) {
Service<| title == 'memcached' |> -> Anchor['keystone::service::begin']
}
我想这会进行资源排序;导致 memcached 服务资源在 keystone::service::begin anchor 之前执行。我真的不知道Anchor是什么。我猜它用于资源排序?
最佳答案
资源收集器有多种用途:
- 他们实现虚拟资源,或者他们收集导出的资源,这取决于收集器的形式。虚拟资源的
realize()
函数也在这个空间发挥作用,但是除了收集器之外别无他法来收集导出的资源。另见下文。 - 它们可以用在链式表达式中,如您的示例所示,以设置排序约束。
- 它们可用于覆盖资源参数。
在这些用途中的每一种中,收集器都具有有时使它们特别方便的属性,其中包括:
- 收集器对目录中的所有匹配资源进行操作,包括在评估收集器表达式时尚未声明的任何资源,无论声明的位置或范围如何。
- 收集器支持过滤谓词(例如
title == 'memcached'
),有助于微调收集哪些资源。这在与标签结合使用时特别有用。 - 收集器可以收集零资源,没关系。
最后一个似乎是您提供的具体示例的要点:因为最多可以有一个 Service
具有 title == 'memcached'
,所以整体表达式如果该服务包含在目录中,则会导致该服务在 Anchor['keystone::service::begin']
之前同步,但如果没有声明此类服务,则它没有任何效果,独立于 list 解析命令。我认为没有任何其他独立于解析顺序的方法可以实现这一点。
关于puppet - 为什么要使用 "resource collectors"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39275496/