为什么要使用 "resource collectors"?

Why would one use "resource collectors"?

我正在查看 Puppet Forge 上的 OpenStack 模块。这些模块使用 "resource collectors" 所以我在这里阅读 "resource collectors":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是什么。我猜它用于资源排序?

资源收集器有多种用途:

  • 他们实现虚拟资源,或者他们收集出口的,取决于收集者的形式。虚拟资源的realize()功能也在这个space中发挥,但是除了收集器之外没有办法收集导出的资源。另见下文。
  • 它们可以用在链式表达式中,如您的示例所示,以设置排序约束。
  • 它们可用于覆盖资源参数。

在这些用途中的每一种中,收藏家都具有有时使它们特别方便的特性,其中包括:

  • 收集器对目录中的所有匹配资源进行操作,包括在计算收集器表达式时尚未声明的任何资源,无论声明的位置或范围如何。
  • 收集器支持过滤谓词(例如 title == 'memcached'),这有助于微调收集哪些资源。这在与标签结合使用时特别有用。
  • 收集器可以收集零资源,没关系。

最后一个似乎是您提供的具体示例的要点:因为最多可以有一个 Service 具有 title == 'memcached',所以整体表达式导致该服务在 [= 之前​​同步14=] 如果它包含在目录中,但如果没有声明此类服务,它就没有效果,与清单解析顺序无关。我认为没有其他 parse-order-independent 方法可以做到这一点。