Во время написания модуля я обнаружил, что у меня есть огромный количество настраиваемых деталей. Чтобы лучше организовать модуль (для удобства чтения и сопровождения), я выбрал разделить файлы шаблона. Поскольку эти части / фрагменты шаблона уже суммируют группы настраиваемых переменных, я подумал, что может оказаться полезным использовать хэши, которые представляют содержимое шаблона. фрагменты
(hash) $db -> template( config.db.erb )
(hash) $*** -> template( config.***.erb )
По какой-то причине у меня что-то не так с Puppet / Ruby foo, которое я настроил, поскольку используются только введенные значения хэша, а остальные остаются undef
.
# Calling the module
class { 'wppuppet':
location => '/var/www/wp',
db => {
prefix => 'foo',
user => 'usr',
pass => '^[:D',
},
}
Фактический класс init наследуется от класса параметров по умолчанию
# init.pp
class wppuppet(
$location = $wppuppet::params::location,
$db = $wppuppet::params::db
) inherits wppuppet::params {
validate_hash( $db )
validate_string( $db['name'] )
# ...
validate_bool( str2bool( $db['repair'] ) )
class { 'wppuppet::config':
db => {
prefix => $db['prefix'],
name => $db['name'],
user => $db['user'],
pass => $db['pass'],
host => $db['host'],
repair => $db['repair'],
}
}
# The params.pp defaults class
class wppuppet::params {
$db = {
prefix => 'wp',
name => 'wordpress',
user => 'root',
pass => 'root',
host => 'localhost',
charset => 'utf8',
repair => true,
}
}
Тогда есть config.pp
файл, содержащий wppuppet::config
класс, который генерирует файл из объединенных шаблонов.
# The actual config.php file
file { "${location}/config.php":
ensure => file,
content => template(
'wppuppet/config.db.erb',
'wppuppet/config.debug.erb'
# ...
),
}
И, наконец, есть config.database.erb
файл
define( 'DB_NAME', '<%= @db['name'] %>' );
define( 'DB_USER', '<%= @db['user'] %>' );
define( 'DB_PASSWORD', '<%= @db['pass'] %>' );
define( 'DB_HOST', '<%= @db['host'] %>' );
редактировать Может ли кто-нибудь объяснить мне, где я потерял счет и почему я не могу получить значения по умолчанию? Когда я размещаю notice('params loaded')
или просто сбросить $db
хеш, я вижу, что он устанавливается в каждом классе в CLI, но не в config.pp
файл / конфигурационный класс.
Значения по умолчанию для классов либо используются (полностью), либо заменяются при объявлении класса. Puppet не имеет возможности каким-либо образом объединить хэши.
Вы можете переключиться на Hiera основанный подход. Поместив значения по умолчанию и определенные значения в свою иерархию, вы можете воспользоваться способностью Hiera выполнять глубокое слияние вам видимо требуется.