Puppet-遍历哈希时在hiera中不存在的情况下在清单中设置默认值

击中

我遍历许多条目在hiera散列,并希望通过设置在清单中的默认值(例如,从hiera除去相同的重复行ensuregroupsmanagehome等等),并且具有默认值重写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更喜欢使用自动参数绑定,而您正在使用它们(对于lookupHiera 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章