我有一个Puppet类,它设置了许多服务和configuration文件。 在大多数情况下,可以使用默认服务器,但也可以configuration显式的每服务器服务器。 我发现自己一直在这样做:
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
…但variables不能在Puppet中重新分配。 有没有更好的方法来做到这一点?
虽然不完全是你要求的,你有没有考虑使用外部节点分类器设置和覆盖特定服务器的默认值? 我相信ECN是在像你这样的情况下做事的“傀儡方式”。
编辑:(根据第一个评论)
第二个想法:你可以使用一个自定义函数,至less使多行重复逻辑更具可读性。 像这样的东西,它返回第一个“定义”的参数,虽然与puppet,我不知道什么是“定义”(在这种情况下,“undef”作为一个空string传递给函数,这仍然足够好) 。
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)
自从我在多年前发布这个问题以来,Puppet的stdlib模块已经学习了pickfunction,它将从值列表中返回第一个非undef或非空值。 所以可以写:
$real_server_for_thing1 = pick($server_for_thing1, $default_server)
还有一个pick_default函数,空值是有效的(你只想忽略undef )。