Puppet 3.8.# inline_template не может получить иерархические данные

Я работаю над созданием кукольного модуля. Моя кукольная версия 3.8.7, и об обновлении не может быть и речи. Мои иерархические данные и относительное содержимое файла init.pp скопированы ниже для справки.

---------Hiera Data---------
my_hieradata:
  blue: http://foobar.com
  red: http://barfoo.com
----------------------------

---------My_init.pp---------
$my_hieradata= hiera('my_hieradata') 
.
. 
if $my_hieradata{    $my_site = inline_template('<% if @my_hieradata-%><% @my_hieradata.each do |key, value| -%><%= key %>,<% end -%><% end -%>')
  $my_array = split($my_site,',')
  mymodule::my.log { $my_array:;
  }
.
.
.
define mymodule::my_log {
  file { '/foo/bar/log/${name}.log':
    ensure => 'file',
    mode   => '0644',
    owner  => 'zeus',
    group  => 'zeus',
  }
}
----------------------------

Я надеялся, что это создаст два файла в соответствии с моими иерархическими данными.

/foo/bar/log/blue.log
/foo/bar/log/red.log

однако, когда я запускаю марионетку, происходит сбой с ошибкой ниже.

Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Duplicate declaration: File[/foo/bar/log/${name}.log] is already declared in file /etc/puppet/modules/mymodule/manifests/init.pp:100; cannot redeclare at /etc/puppet/modules/mymodule/manifests/init.pp:100 on node cc1.prodops.tllsc.net
Warning: Not using cache on failed catalog

Из ошибки я вижу, что переменная ${name} не может получить значение из hieradata. Он обрабатывает переменную как строку и печатает ее как есть. Попросите экспертов помочь мне, почему varibale не получает значение от hiera.


person data-bite    schedule 23.11.2020    source источник
comment
Предполагая, что будущий синтаксический анализатор здесь, поскольку у вас есть лямбда-итератор. Вместо всей сложности создания массива из вашего хэша в процессе, который вы используете, почему бы не использовать функцию keys для прямого возврата массива из хеша? Это, вероятно, решит большинство ваших проблем здесь.   -  person Matt Schuchard    schedule 23.11.2020


Ответы (1)


Основная проблема заключается в том, что вы используете буквальную строку (одинарные кавычки) в качестве заголовка вашего файлового объекта вместо интерполированной строки (двойные кавычки). обновите свой файловый объект до следующего, и я думаю, что он должен работать

define mymodule::my_log {
  file { "/foo/bar/log/${name}.log":
    ensure => 'file',
    mode   => '0644',
    owner  => 'zeus',
    group  => 'zeus',
  }
}

однако, как упомянул Мэтт Шухард, если у вас есть парсер будущего, вы можете использовать функции ключей и упростить свой код до

my_hieradata:
  blue: http://foobar.com
  red: http://barfoo.com
define mymodule::my_log {
  file { "/tmp/${name}.log":
    ensure => 'file',
    mode   => '0644',
  }
}
$my_hieradata = hiera('my_hieradata')
mymodule::my_log{$my_hieradata.keys(): }
person balder    schedule 24.11.2020
comment
Или, если OP не может использовать встроенную функцию keys() по какой-либо причине, версии модуля puppetlabs/stdlib, совместимые с Puppet 3, предлагают ее. - person John Bollinger; 01.12.2020
comment
Байдер спасибо. Я обновил код, чтобы он имел интерполированную строку (двойные кавычки), и это сработало как шарм. Большое спасибо. - person data-bite; 02.12.2020