The lookup
函数使您能够为哈希本身建立默认值,但不能真正为哈希内的键和值建立默认值。此外,使用lookup
在 Puppet 中作为类参数值的函数将被自动参数绑定取代。换句话说,你的lookup
在此上下文中,函数不执行任何操作,因为 Puppet 更喜欢自动参数绑定,而您正在使用这些参数(这对于lookup
与您正在使用的 Hiera 5 结合使用)。我个人觉得这种行为很烦人,但事实就是如此。编辑:别介意具体的推理;该参数被称为$testhash
并不是$hash
。如果该参数来自模块数据,那么lookup
仍然会被忽略,因为 Puppet 只允许模块数据的自动参数绑定。
我很惊讶资源默认值在这里不适合您。我必须相信这要么是无意的,要么是当你走那条路时对他们实施了错误。
无论如何,这里有一个有保证的方法。首先,我们实现每个表达式的默认属性:https://puppet.com/docs/puppet/5.3/lang_resources_advanced.html#per-expression-default-attributes https://puppet.com/docs/puppet/5.3/lang_resources_advanced.html#per-expression-default-attributes
class test (
Hash $testhash = lookup('test::hash', "merge" => 'hash'}),
){
$testhash.each |String $key, Hash $value| {
user {
default:
ensure => present,
name => 'username',
password => 'userpassword',
groups => ['usergroups'],
managehome => false,
;
$key:
ensure => $value['ensure'],
name => $value['name'],
password => $value['password'],
groups => $value['groups'],
managehome => $value['managehome'],
;
}
}
}
但这里仍然存在一个问题,即您正在为所有迭代的第二个块中的属性建立值。如果这些键值对未定义,Puppet 将出错,而不是默认为另一个值。我们需要指示 Puppet 仅在您首先为属性定义了值的情况下才为属性建立值。值得庆幸的是,我们可以用*
属性:https://puppet.com/docs/puppet/5.3/lang_resources_advanced.html#setting-attributes-from-a-hash https://puppet.com/docs/puppet/5.3/lang_resources_advanced.html#setting-attributes-from-a-hash
class test (
Hash $testhash = lookup('test::hash', "merge" => 'hash'}),
){
$testhash.each |String $key, Hash $value| {
user {
default:
ensure => present,
name => 'username',
password => 'userpassword',
groups => ['usergroups'],
managehome => false,
;
$key:
* => $value,
;
}
}
}
这里的一项建议是让你的 lambda 迭代器变量$key, $value
命名更透明一些。另一个注意事项是警告*
属性要起作用,您的哈希键必须与 Puppet 属性名称匹配。
更新的问题:在哈希有一个带有 a 的键的情况下nil
value,您可以在 lambda 迭代器参数中设置一个空哈希作为键值的默认值。空哈希将替换undef
(木偶nil
) 为了$value
在那次迭代期间。这将确保没有属性和值包含在*
操作员并以所有默认值为准。
class test (
Hash $testhash = lookup('test::hash', "merge" => 'hash'}),
){
$testhash.each |String $key, Hash $value = {}| {
user {
default:
ensure => present,
name => 'username',
password => 'userpassword',
groups => ['usergroups'],
managehome => false,
;
$key:
* => $value,
;
}
}
}