Puppet 变量、默认值、合并和模板

Puppet 变量、默认值、合并和模板

在编写模块的过程中,我发现我有一个巨大的可配置部件的数量。为了更好地组织模块(为了可读性和可维护性),我选择了拆分模板文件由于这些模板部分/片段已经总结了可配置变量组,我认为使用表示模板内容的哈希可能会很方便碎片

(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 类继承自 params defaults 类

# 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文件/配置类中设置。

答案1

类的默认值要么全部使用,要么在类声明期间被替换。Puppet 没有办法以某种方式将哈希合并在一起。

您可能希望切换到希拉基于方法。通过将默认值和特定值放入层次结构中,您可以利用 Hiera 执行深度合并你显然需要。

相关内容