我有一个正确安装文件的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知识的极限。我明白,当我认为我应该在木偶中进行迭代时,我可能错了,但我对如何做到这一点感到有点困惑。
有关如何操作或阅读要学习的内容的任何指示?
答案 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']: }