документация puppetlabs-postgresql рекомендует установить значения в postgresql:: globals как так:
class { 'postgresql::globals':
encoding => 'UTF8',
locale => 'en_NG',
}->
class { 'postgresql::server':
}
Однако это не работает:
class { 'postgresql::client: }
class { 'postgresql::globals':
encoding => 'UTF8',
locale => 'en_NG',
}->
class { 'postgresql::server':
}
Поскольку postgresql:: клиент наследовался postgresql:: параметры, который наследовался postgresql:: globals. Таким образом, когда это добирается до явного инстанцирования postgresql:: класс globals, это жалуется на дублирующееся определение.
изменяя порядок, это действительно работает:
class { 'postgresql::globals':
encoding => 'UTF8',
locale => 'en_NG',
}->
class { 'postgresql::server':
}
class { 'postgresql::client: }
Однако в реальном использовании, моем инстанцировании postgresql:: клиент и postgresql:: сервер находится в различных классах, связанных с классами сервера, которые я использую, и я действительно не хочу создавать необходимое упорядочивание для тех классов. Кроме того, я хочу, чтобы globals определения относились к postgresql:: клиент даже на серверах, которые не выполняют postgresql:: сервер.
Если бы мы использовали марионетку 3.x, то я определил бы необходимые значения globals в hiera, но мы находимся все еще на марионеточных 2.7.
Существует ли способ зафиксировать это, не изменяя puppetlabs распределение? Я в настоящее время думаю, что это может гарантировать отчет об ошибках к puppetlabs, но все еще задаться вопросом, пропускаю ли я просто простое решение.
Править: считав вход @FelixFrank, я создал отчет об ошибках в https://tickets.puppetlabs.com/browse/MODULES-1466.
Да, Hiera будет лучшим решением. Обратите внимание, что вы можете (и должны) добавить Hiera в Pupet 2.7.x
в форме плагина.
За исключением этого, ваши возможности ограничены. Связь требует
между любыми двумя классами не будет иметь эффекта . Напротив, обратите внимание, что следующий рефакторинг вашего рабочего манифеста также приводит к ошибке:
class { 'postgresql::server': }
<-
class { 'postgresql::globals':
encoding => 'UTF8',
locale => 'en_NG',
}
Причина в том, что проблема основана на порядке анализа или порядке оценки - порядок, в котором компилятор манифеста встречает объявления классов. Параметры require / before
(и стрелки цепочки) только добавляют отношения к создаваемому каталогу для использования марионеточным агентом
.
В принципе, вам нужно будет убедиться, что ваш собственный класс сервера PostgreSQL всегда оценивается перед классом клиента, например
role::posgre_server_with_client {
include profiles::postgre_server
include profiles::postgre_client
}
Такой порядок не всегда может быть гарантирован в сложных манифестах (которые могут включать
, особенно клиентские функции из различных контекстов). Таким образом, я думаю, что есть веские основания объявлять это ошибкой в модуле. Поскольку паттерны, которые приводят к проблеме, довольно распространены (я думаю), может быть причина подвергнуть сомнению текущую практику проектирования модулей в целом.
Я постараюсь собрать еще несколько мнений сообщества по этому поводу.