Я хочу передать аргумент datadir в postgresql :: globals, только если он содержит значение.
Вам не нужно беспокоиться о том, чтобы не передавать datadir
, если оно не содержит значения. Просто передайте параметр в postgresql::globals
вместе с другими вашими параметрами. Если datadir
имеет значение, то класс будет использовать его, а если нет, postgresql::globals
будет обрабатывать его просто отлично и использовать свои собственные значения по умолчанию. Вам нужно изменить способ передачи параметра, но это не сработает: datadir => "${datadir}"
, вы должны передать его следующим образом datadir => $datadir,
. Ваше определение может быть таким простым:
define setup_postgresql_globals (
$datadir = undef,
) {
class { 'postgresql::globals':
datadir => $datadir,
needs_initdb => true,
version => '9.3',
}
}
Причина, по которой вы получаете Error: Duplicate declaration: Class[Postgresql::Globals] is already declared
, заключается в том, что вы запускаете определенное количество раз. По своей природе определение может быть создано несколько раз, поэтому может быть проблематично сделать класс, такой как include, внутри одного, поскольку вы можете включить класс, подобный этому, только один раз. Есть несколько способов решить эту проблему.
1) Оцените вашу потребность в этом определении вообще. Он выглядит так, как будто вы создали это определение только для обработки параметра datadir
, являющегося значением undef
. Как я показал выше, вам может не понадобиться это определение, так как ваша логика не нужна.
2) Вы должны делать только базовые включения классов в пределах определения. Вы можете включить такой класс несколько раз. Вам придется обрабатывать настройку datadir
с помощью автоматической системы поиска параметров от hiera. Например:
define setup_postgresql_globals (
$datadir = undef,
) {
include 'postgresql::globals'
}
Опять же, вам, вероятно, следует удалить это определение и дескриптор, включая postgresql::globals
, из которого создается экземпляр setup_postgresql_globals
.