从木偶代码(或“木偶查找”cmd)访问多个嵌套的hiera值

时间:2018-02-09 22:07:56

标签: yaml puppet hiera

这可能是一个非常简单的问题,但似乎很难在互联网上搜索答案,或者至少我花了太多时间来处理这个问题。

如何使用foo::bar或更好的方式从Puppet模块中的hieradata文件(下面)中的所有lookup()值访问或直接制作列表?

---
foo::bar:
    'some uniq name':
        baz: 12345
        ...

    'another uniq name':
        baz: 54321
        ...

因此,如果可以使用通配符,则关键路径将如下所示 - > foo::bar::*::baz.

1 个答案:

答案 0 :(得分:3)

这需要使用lookup函数,lambda迭代器和哈希语法表示法,所以它实际上并不那么容易,尽管代码可能会让它看起来那样。

我们需要迭代foo::bar哈希中的键的值。我们可以从那开始:

lookup(foo::bar, Hash).each |String $key, Hash $value| {
  # first $key is 'some uniq name' string
  # first $value is 'some uniq name' hash
}

现在我们需要在每个嵌套哈希中访问bar键的值。我们可以通过正常的语法来访问哈希中的键值:

lookup(foo::bar, Hash).each |String $key, Hash $value| {
  $value['baz'] # first value is 12345
}

但是,我们需要将这些值存储在变量中,以便在退出lambda范围后保留它们而不是丢弃它们。因此,我们需要有一个变量存储lambda迭代器的返回值,并使用一个返回修改过的数组的lambda迭代器:

$bazes = lookup(foo::bar, Hash).map |String $key, Hash $value| {
  $value['baz']
}

从而实现了在hieradata中存储所有baz值的数组(或列表)的目标。虽然代码很短,但可以说并不那么简单。

有用的文档 -

查询:https://puppet.com/docs/puppet/5.2/hiera_use_function.html
lambda迭代器maphttps://puppet.com/docs/puppet/5.3/function.html#map
访问哈希值:https://puppet.com/docs/puppet/5.3/lang_data_hash.html#accessing-values