如何基于 Puppet 中定义类型的实例构建文件

How to build a file based on defined-type instances in Puppet

我希望我的 Puppet class 创建一个文件资源,其内容基于特定定义类型的所有实例。我查看 this question 的想法是遍历实例以构建文件,但显然它是 "Bad Idea" 每个当前存在的答案。

一些背景:我正在 Puppet 中构建 monitor_service class 以部署自定义监控应用程序。应用程序读取一个配置文件,告诉它要监视什么,每行一个项目,按照

ITEM: /var/things/thing-one (123)
ITEM: /var/things/thing-two (456)

我也在写一个部署监控项实例的定义类型:

define my_thing::monitored_thing ( $port ) {
  file { "/var/things/$name":
     ...
  }
}

在给定的节点上,我设置了几个 monitored_things,例如

my_thing::monitored_thing { "thing-one":
  port => 123
}
my_thing::monitored_thing { "thing-two":
  port => 456
}

构建监控服务配置文件的 "right" Puppet 习惯用法是什么?我更希望它以这样一种方式工作,即 monitor_service class 不必被告知它正在监视哪些 monitored_thing 个实例——只需创建一个 monitored_thing实例应使其自动添加到配置文件中。

有几种方法可以 modify/declare 多个定义类型中的文件的一部分:

  1. 使用 puppetlabs-stdlibfile_line。这使您可以指定文件应包含特定行。当您不关心其他文件内容而只想确保某行存在或不存在时最好。

  2. 如果您想确保最终文件仅包含您指定的片段或片段的顺序很重要,请使用puppetlabs-concat

  3. 如果你需要edit/add配置到结构更复杂的文件,如xml、apache配置等,请使用augeas type