Назад | Перейти на главную страницу

Переменные марионетки, значения по умолчанию, слияние и шаблон

Во время написания модуля я обнаружил, что у меня есть огромный количество настраиваемых деталей. Чтобы лучше организовать модуль (для удобства чтения и сопровождения), я выбрал разделить файлы шаблона. Поскольку эти части / фрагменты шаблона уже суммируют группы настраиваемых переменных, я подумал, что может оказаться полезным использовать хэши, которые представляют содержимое шаблона. фрагменты

(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 выполнять глубокое слияние вам видимо требуется.