我们正在从 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
}
}