#loops #puppet #hiera
#циклы #марионетка #hiera
Вопрос:
Я работаю над созданием кукольного модуля. Моя версия puppet — 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} не удается получить значение из иерархических данных. Он обрабатывает переменную как строку и печатает ее такой, какая она есть. Попросите экспертов здесь помочь мне, почему переменная не получает значение от hiera.
Комментарии:
1. Предполагая, что будущий синтаксический анализатор здесь, поскольку у вас есть лямбда-итератор. Вместо всей сложности создания массива из вашего хэша в процессе, который вы используете, почему бы не использовать
keys
функцию для прямого возврата массива из хэша? Это, вероятно, решит большинство ваших проблем здесь.
Ответ №1:
Основная проблема заключается в том, что вы используете литеральную строку (одинарные кавычки) в качестве заголовка вашего файлового объекта вместо интерполированной строки (двойные кавычки). обновите свой файловый объект следующим образом, я думаю, он должен работать
define mymodule::my_log {
file { "/foo/bar/log/${name}.log":
ensure => 'file',
mode => '0644',
owner => 'zeus',
group => 'zeus',
}
}
однако, как упоминал Мэтт Шучард, если у вас есть анализатор будущего, вы можете использовать функции keys и упростить свой код до
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(): }
Комментарии:
1. Или, если OP по какой-либо причине не может использовать встроенную
keys()
функцию, тогда версии модуля puppetlabs / stdlib, совместимые с Puppet 3, предлагают ее.2. Спасибо байдеру. Я обновил код, чтобы иметь интерполированную строку (двойные кавычки), и это сработало как шарм. Большое спасибо.