我遍历许多条目在hiera散列,并希望通过设置在清单中的默认值(例如,从hiera除去相同的重复行ensure
,groups
,managehome
等等),并且具有默认值重写IF在hiera存在重复的键/值对。
到目前为止,我尝试过的所有操作都无法获得默认值。我的想法是我需要声明资源,但是不确定。
我尝试在查找和其他方法中设置“ default_values_hash”,但是似乎没有任何东西可以将默认值传递给迭代和--debug输出
这是清单和工资单数据的(伪)示例。真诚地感谢任何指导。谢谢。
class test (
Hash $testhash = lookup('test::hash', "merge" => 'hash'}),
){
$testhash.each |$key, $value| {
user { $key :
ensure => $value['ensure'],
name => $value['name'],
password => $value['password'],
groups => $value['groups'],
managehome => $value['managehome'],
}
}
}
include class test
在希拉:
test::hash:
'fred':
name: fred
password: somepassword
groups: wheel
managehome: true
'mary':
name: mary
password: otherpassword
'john':
name: john
password: anotherpassword
'harry':
在清单中设置资源默认值(使用大写字母User
)不会传递到迭代中,尽管如果我将所有数据都保留在清单中(这样做的数据太多),它也会这样做。
该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
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
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属性名称匹配。
更新的问题:在散列包含具有nil
值的键的情况下,可以在lambda迭代器参数中将空散列设置为键值的默认值。空哈希将替换该迭代期间的undef
(Puppet 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,
;
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句