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

如何使参数化的 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...
}

随着可能的服务数量不断增加,这种语法变得难以处理。有没有更好的方法?我真的想要类似这样的方法:

$server_for_thing1 = $server_for_thing1 || $default_server

...但变量不能在 Puppet 中重新分配。有没有更好的方法?

答案1

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

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

第二个想法:您可以使用自定义函数至少使多行重复逻辑更易读一些。类似这样的代码,它返回第一个“defined”参数,尽管使用 puppet,我永远不确定“defined”是什么(在这种情况下,“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

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

$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)

答案2

自从我多年前发布这个问题以来,Puppet 的stdlib模块已经了解了挑选函数,它将返回undef值列表中第一个非空值或非空值。因此可以这样写:

$real_server_for_thing1 = pick($server_for_thing1, $default_server)

还有一个pick_default函数空值有效(你只想忽略undef)。

相关内容