如何使参数化 Puppet 类中的变量默认为另一个参数的值?

lar*_*sks 6 puppet

我有一个 Puppet 类,它设置了许多服务和配置文件。在大多数情况下,可以使用默认服务器,但也可以为每个服务配置显式服务器。我发现自己一直在这样做:

class myclass (
  $default_server    = 'server.example.com',
  $server_for_thing1 = undef,
  $server_for_thing2 = undef,
  $server_for_thing3 = undef
) {

  if $server_for_thing1 {
    $real_server_for_thing1 = $server_for_thing1
  } else {
    $real_server_for_thing1 = $default_server
  }

  # ...and so forth...
}
Run Code Online (Sandbox Code Playgroud)

随着可能的服务数量越来越大,这种语法变得笨拙。有没有更好的方法来做到这一点?我真的想要一些类似的东西:

$server_for_thing1 = $server_for_thing1 || $default_server
Run Code Online (Sandbox Code Playgroud)

...但不能在 Puppet 中重新分配变量。有没有更好的方法来做到这一点?

chu*_*utz 2

虽然不完全是您所要求的,但您是否考虑过使用外部节点分类器来设置和覆盖特定服务器的默认值?我相信 ECN 是在像您这样的情况下做事的“傀儡方式”。

编辑:(基于第一条评论)

第二个想法:您可以使用自定义函数至少使多行重复逻辑更具可读性。像这样的东西,它返回第一个“定义”参数,尽管使用木偶,我永远不确定“定义”是什么(在这种情况下,“undef”作为空字符串传递给函数,这仍然足够好) 。

module Puppet::Parser::Functions
    newfunction(:get_default, :type => :rvalue) do |args|
        value = nil
        args.each { |x|
            if ! x.nil? and x.length > 0
                value = x
                break
            end
        }
        return value
    end
end
Run Code Online (Sandbox Code Playgroud)

然后您可以根据需要多次调用它:

$real_server_for_thing1 = get_default($server_for_thing1, $default_server)
$real_server_for_thing2 = get_default($server_for_thing2, $default_server)
$real_server_for_thing3 = get_default($server_for_thing3, $default_server)
Run Code Online (Sandbox Code Playgroud)