我正在尝试使用 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)中获取值。
我错过了什么?
提前致谢。