使用 puppet 和 hiera 安装一组文件

Installing a group of files with puppet and hiera

我有一个可以正确安装文件的 puppet 配置。我想让它安装几个文件。配置大致如下(与此处相关的部分):

$stuff = hiera('stuff')
$site_filename = $stuff['site_file']

file { "/path/to/my/file/called/$site_filename":
  ensure  => present,
  owner   => 'the-owner',
  group   => 'the-group',
  mode    => 644,
  source  => "puppet:///modules/this-module/$site_filename",
  require => [Package['something'],
      User['someone']]
}
file { "/path/to/my/symlink/called/$site_filename":
  ensure  => 'link',
  target  => "/path/to/my/file/called/$site_filename",
  require => Package['something'],
}

效果很好,正确的文件安装在正确的主机上。但我现在想安装数量可变(非常相似)的文件,每个主机上的数量不同。

我的 hiera 文件目前是这样的:

stuff:
  site_file: "hey-i-am-the-site-file-on-host-awesomeness"

原则上,我想说这样的话:

stuff:
  site_file: ["hey-i-am-the-site-file-on-host-awesomeness",
              "i-am-also-a-site-file-for-awesomeness",
              "do-not-forget-me-too",
              "someday-you-will-want-me-as-well"]

在这里,我正在触及我的木偶和 hiera 知识的极限。我知道当我认为我应该在 puppet 中迭代时,我可能是错的,但我有点困惑如何做到这一点。

关于如何做或阅读以了解什么的任何指示?

Puppet 4 并具有一些适用于此处的迭代函数,这些函数也可用于最近启用了未来解析器的 Puppet 3。但是,如果没有未来的解析器,它们在 Puppet 3 中不可用,因此您需要一个不同的解决方案。

处理此类问题的经典方法是依赖这样一个事实,即标题为数组(文字或 array-valued 变量)的资源声明为每个元素声明一个单独的资源大批。这通常与定义的类型结合作为直接声明的资源。这种组合大致相当于对数组元素的 foreach 循环,其中 defined-type body 作为其 body。示例:

define mymodule::sitefile() {
    file { "/path/to/my/file/called/$title":
      ensure  => present,
      owner   => 'the-owner',
      group   => 'the-group',
      mode    => 644,
      source  => "puppet:///modules/mymodule/$title",
      require => [Package['something'], User['someone']]
    }

    file { "/path/to/my/symlink/called/$title":
      ensure  => 'link',
      target  => "/path/to/my/file/called/$title",
      require => Package['something']
    }
}

# ...

$stuff = hiera('stuff')
mymodule::sitefile { $stuff['site_file']: }