Puppet:清单:class 声明中的可选参数

Puppet: manifest: optional parameter within class declaration

我有一个 puppet 清单要应用,但是,根据目标,定义的 puppet 模块 class 不支持某些参数,而它会在其他目标上支持。

e.g. on targetA init.pp: 
   class myclass (
       $foo = undef,
       $bar = undef)
On targetB init.pp:
      class myclass(
           $foo = undef)

有没有一种方法可以在不修改目标上已安装的模块的情况下可变地更改声明中的参数?

即在 targetA 上,(运行 人偶版本 5.x):

                file {‘extra.conf’:
                       ensure => present}
                 ->
                 class {‘::myclass’:
                       foo => ‘myfoo’
                      }

在目标 B 上时,(运行 人偶版本 4.x):

                file {‘extra.conf’:
                       ensure => present|
                 -> 
                 class {‘::myclass’:
                      foo => ‘myfoo’,
                      bar => ‘mybar’
                  }

但是,如果在目标A上以这种方式声明class,则会由于额外的'bar'参数而发生错误。有没有办法在使清单可移植的同时保留模块(均命名为 'myclass')?

Is there a way to keep the modules (both named 'myclass') while making the manifest portable?

是的。

选项 1 - 自动数据绑定

将 class 参数放入 hiera 数据中,使用 include 类 class 声明而不是资源类 class 声明,并依赖自动数据绑定。您可以在每个节点上放置相同的数据,因为自动数据绑定只查找 classes 定义参数的值——它会忽略与 [=28= 不对应的键,无论形式如何]参数。

选项 2 - 条件语句

Puppet DSL 有一套相当丰富的条件语句,您可以使用它们来 select 适合实际目标节点的声明。这里真正的技巧是使用什么条件来区分,因为没有简单的方法可以直接测试 class 是否支持特定参数。您当然可以通过 $hostname$certname 来区分,但是如果有两台以上的机器,那么您可能需要更通用的东西,例如 $server_facts['serverversion'].

例如,

  case $server_facts['serverversion'] {
    # Puppet version 4
    /^4[.]/: { class { '::myclass': foo => 'myfoo' } }

    # Anything else
    default: { class { '::myclass': foo => 'myfoo', bar => 'mybar' } }
  }

  file { 'extra.conf':
    ensure => 'present',
    before => Class['::myclass'],
  }