Я пытаюсь использовать heira для переопределения параметров класса в марионетке. У меня такой класс:
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"
Чтобы проверить проблему дальше, я установил следующие значения в "{:: trust.certname} .yaml"
testvalue: host
и это в inlg.yaml:
testvalue: group
Добавляю в класс:
$testvalue = lookup("testvalue")
notify {"testvalue is $testvalue": }
Как и следовало ожидать, код возвращает значение test, равное host. Для меня это имеет смысл, поскольку значение в более конкретном "{:: trust.certname} .yaml" переопределяет значение в inlg.yaml (хотя и "нормальный" поиск, а не параметр класса)
Если я удалю
testvalue: host
из "{:: trust.certname} .yaml"
testvalue тогда равно "группе"
Что, опять же, я ожидал.
Чтобы еще больше запутать ситуацию, если я установлю это в {:: trust.certname} .yaml:
test::parameter1: blah
Затем ресурс notify в классе, показанном выше, возвращает "blah".
Если я удалю
test::parameter1: blah
из {:: trust.certname} .yaml значение параметра1 снова возвращается к "codeddefault"
Я ожидаю, что он получит значение из yaml-файла «группы» (inlg.yaml), как это делают «обычные» поисковые запросы.
Что мне не хватает?
Заранее спасибо.