使用 hiera 覆盖 Puppet 类参数

使用 hiera 覆盖 Puppet 类参数

我正在尝试使用 heira 覆盖 puppet 中的类参数。我有这个类:

class test(
    $parameter1="codeddefault"
) 
{
    notify {"parameter1 is $parameter1": }
}

这是我的 hiera.yaml:

---
version: 5
defaults:
  # The default value for "datadir" is "data" under the same directory as the hiera.yaml
  # file (this file)
  # When specifying a datadir, make sure the directory exists.
  # See https://docs.puppet.com/puppet/latest/environments.html for further details on environments.
  # datadir: data
  # data_hash: yaml_data
hierarchy:
  - name: "Per-node data (yaml version)"
    path: "nodes/%{::trusted.certname}.yaml"
  - name: "Group (Server class or function. e.g. lg for logging server)"
    path: "groups/%{facts.group}.yaml"
  - name: "Other YAML hierarchy levels"
    paths:
      - "common.yaml"

根据一些内部命名约定,定义“组”的事实超出了主机名的子字符串。对于这个问题而言,该约定是什么并不重要。不用说,我已经检查过它是否按预期工作,稍后的输出将显示。

为了回答这个问题,我们假设本例中的组是“inlg”。我的期望是,我应该能够将以下内容放入“inlg.yaml”中:

test::parameter1: groupvalue.

当我运行清单(其中包括测试类)时,通知资源应该输出:

parameter1 is groupvalue

但事实并非如此。相反,它返回“codeddefault”

为了进一步测试问题,我在“{::trusted.certname}.yaml”中设置了以下值

testvalue: host

在 inlg.yaml 中如下:

testvalue: group

我将其添加到课程中:

$testvalue = lookup("testvalue")
notify {"testvalue is $testvalue": }

可以预见的是,代码返回 testvalue 等于“host”。这对我来说很有意义,因为更具体的“{::trusted.certname}.yaml”中的值覆盖了 inlg.yaml 中的值(尽管是“正常”查找,而不是类参数)

如果我删除

testvalue: host 

来自“{::trusted.certname}.yaml”

测试值则等于“group”

这又一次是我所期望的。

更令人困惑的是,如果我在 {::trusted.certname}.yaml 中设置它:

test::parameter1: blah

然后上面显示的类中的通知资源返回“blah”

如果我删除

test::parameter1: blah

从{::trusted.certname}.yaml中,parameter1的值再次返回到“codeddefault”

我希望它像“正常”查找一样从“组”yaml 文件(inlg.yaml)中获取值。

我错过了什么?

提前致谢。

相关内容