Разбор марионетки hiera в inline_template

У меня есть файл .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
0
задан 19 December 2019 в 11:29
1 ответ

Возникла проблема либо со структурой данных, либо с логикой, либо с тем и другим одновременно. Я не уверен, что у меня достаточно здесь, чтобы разобраться, какой.

Первая проблема, которую я вижу, заключается в том, что ваша функция поиска 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. Я хотел продемонстрировать этот способ, потому что вам будет легче изолировать свою проблему.

1
ответ дан 2 January 2020 в 17:17

Теги

Похожие вопросы