Puppet - 在迭代哈希时,如果hiera中不存在,则设置清单中的默认值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Puppet - 在迭代哈希时,如果hiera中不存在,则设置清单中的默认值相关的知识,希望对你有一定的参考价值。

我正在迭代hiera散列中的许多条目,并希望通过设置清单中的默认值(例如ensuregroupsmanagehome等)从hiera中删除相同的重复行,并且如果存在重复的键/值对,则覆盖默认值在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

在Hiera:

test::hash:

'fred':
  name:         fred
  password:     somepassword
  groups:       wheel
  managehome:   true

'mary':
  name:         mary
  password:     otherpassword

'john':
  name:         john
  password:     anotherpassword

'harry':

在清单中设置资源默认值(使用大写的User)不会进入迭代,但如果我将所有数据保留在清单中(太多数据要做)。

答案

lookup函数使您能够为散列本身建立默认值,但不能真正用于散列内的键和值。此外,在Puppet中使用lookup函数作为类参数值将被自动参数绑定取代。换句话说,你的lookup函数在这个上下文中没有任何作用,因为Puppet更喜欢自动参数绑定,而你正在使用它们(对于lookup和Hiera 5一起使用肯定是这样,你看起来正在使用它)。我个人觉得这种行为很烦人,但事实就是如此。编辑:没关系那个具体的推理;该参数称为$testhash而不是$hash。如果该参数来自模块数据,那么lookup仍然会被忽略,因为Puppet只允许模块数据的自动参数绑定。

我很惊讶资源默认设置不适合你。我不得不相信这是无意的,或者当你走这条路线时,某些事情被误解了。

无论如何,这是一个有保障的方法。首先,我们实现per-expression默认属性: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迭代器参数中键值的默认值。在该迭代期间,空哈希将替换undefnil(Puppet $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,
      ;
    }
  }
}

以上是关于Puppet - 在迭代哈希时,如果hiera中不存在,则设置清单中的默认值的主要内容,如果未能解决你的问题,请参考以下文章

在使用“each”迭代哈希时添加新成员

迭代时无意中将键添加到哈希

广播哈希连接 - 迭代

密码验证在德鲁的手册中不起作用(密码哈希)[重复]

未捕获的 ReflectionException:特使部署中不存在类哈希

为啥不将哈希函数迭代 10,000,000 次? [复制]