Puppet:用哈希迭代替换 create_resources()

Puppet:用哈希迭代替换 create_resources()

我们正在从 Puppet 2 迁移到 5。范围似乎有些不同。以前,当使用create_resources()hiera_hash 和默认哈希时,调用脚本中的变量可供 ERB 使用,但现在似乎不行了。例如,我可以$a = 'hello world'在调用脚本中设置create_resources(),然后在我的 ERB 中,我可以简单地引用$a并返回hello world。现在似乎情况并非如此。

因此,我的想法是放弃create_resources()并使用 Puppet 5 的each功能,只需hiera_hash在循环内创建一个新文件即可。但是,我无法将默认值合并到每个哈希元素。我无法重新声明变量,因此似乎无法在循环内进行合并。

下面是我正在尝试做的一个例子:

数据.文件1.yaml

my::data:
  element_a:
    fname: 'Brian'
    lname: 'Detweiler'
  element_b:
    fname: 'Joe'
    lname: 'Schmoe'

数据.默认.yaml

my::defaults
  mname: 'M.'

在我将这两者拉进来hiera_hash并执行之前create_resources('my::template::script', $names, $names_default),我最终会得到预期的合并:

'element_a' => { fname => 'Brian', lname => 'Detweiler', mname => 'M.'},
'element_b' => { fname => 'Joe', lname => 'Schmoe', mname => 'M.'}

现在我想做

$names.each | String $key, Hash $value | {
  $merged_hash_val = $names_default + $value
  file {
    # ... create file with $merged_hash_val in here
  }
}

但由于变量是不可变的,我无法重新赋值。有办法解决这个问题吗?

答案1

模板仍然可以访问变量。我担心那里还发生了其他事情。如果您解决了这个问题,您可能不想改变您的create_resources()用法。

看:https://puppet.com/docs/puppet/5.5/lang_template_erb.html#accessing-puppet-variables

答案2

自由贸易协定

$names.each | String $key, Hash $value | {
  $merged_hash_val = $names_default + $value
  file {
    * => $merged_hash_val
  }
}

https://puppet.com/docs/puppet/7/lang_resources.html#lang_resource_syntax-setting-attributes-from-hash

相关内容