使用puppet和hiera安装一组文件

时间:2016-07-13 13:37:04

标签: puppet 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知识的极限。我明白,当我认为我应该在木偶中进行迭代时,我可能错了,但我对如何做到这一点感到有点困惑。

有关如何操作或阅读要学习的内容的任何指示?

1 个答案:

答案 0 :(得分:2)

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

解决诸如此类问题的经典方法是依赖于以下事实:标题是数组(文字或数组值变量)的资源声明为数组的每个元素声明一个单独的资源。这通常与定义的类型组合作为直接声明的资源。这种组合大致相当于数组元素上的foreach循环,其中定义类型的主体为其主体。例如:

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']: }