У меня есть файл .yaml hiera с:
iptables::test:
ip:
1.1.1.1 : 'adm-1'
2.2.2.2 : 'adm-2'
3.3.3.3 : 'adm-3'
И я хочу проанализировать этот файл в inline_template. Я пишу:
$variable1 = hiera('iptables::test.ip')
$variable2 = inline_template("<% @variable1.each do |key,value| %>Allow From <%=key %> #<%=value %>\n<% end -%>")
Но получаю ошибку:
Error 400 on SERVER: Could not find data item iptables::test.ip in any Hiera data file and no default supplied
Проблема связана либо с вашей структурой данных, либо с вашей логикой, либо с обоими. Я не уверен, что у меня здесь достаточно, чтобы разобраться в каких.
Первая проблема, которую я вижу, это ваша hiera()
функция поиска не может найти гнездо ip
хэш напрямую. Ваш ключ Hiera просто iptables::test
. Вы можете получить полную информацию об этом с помощью поиска и при необходимости проанализировать его дальше.
$variable1 = hiera('iptables::test')
Если вам не нужны вложенные ip
хеш твой inline_template()
работает как написано. Ваша структура данных будет всего лишь одним хешем.
---
iptables::test:
1.1.1.1: adm-1
2.2.2.2: adm-2
3.3.3.3: adm-3
Если вам нужен вложенный хеш, вам понадобится вложенный цикл.
$variable2 = inline_template("<% @variable1.keys.each do |ip| %><% @variable1[ip].each do |key, value| %>Allow From <%= key %> #<%= value %>\n<% end %><% end %>")
Собираем все вместе, чтобы продемонстрировать:
$ cat test.pp
$variable1 = {
ip => {
'1.1.1.1' => 'adm-1',
'2.2.2.2' => 'adm-2',
'3.3.3.3' => 'adm-3',
},
}
$variable2 = inline_template("<% @variable1.keys.each do |ip| %><% @variable1[ip].each do |key, value| %>Allow From <%= key %> #<%= value %>\n<% end %><% end %>")
notice($variable2)
$ puppet apply test.pp
...
Notice: Scope(Class[main]): Allow From 1.1.1.1 #adm-1
Allow From 2.2.2.2 #adm-2
Allow From 3.3.3.3 #adm-3
Notice: Compiled catalog for localhost in environment production in 0.02 seconds
Notice: Applied catalog in 0.01 seconds
В моем тесте не использовалась Hiera, потому что Hiera - это просто способ переноса данных извне класса Puppet. Я хотел продемонстрировать этот способ, потому что вам будет легче изолировать вашу проблему.