I have a Puppet class that sets up a number of services and configuration files. In most cases, there is a default server that can be used, but it is also possible to configure explicit per-service servers. I find myself doing this all the time:
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...
}
As the number of possible services grows large, this syntax becomes unwieldy. Is there a better way of doing this? I really want something along the lines of:
$server_for_thing1 = $server_for_thing1 || $default_server
...but variables cannot be re-assigned in Puppet. Are there better ways of doing this?
While not exactly what you are asking for, have you considered using an External Node Classifier to set and override the default value for specific servers? I believe the ECN is the "puppet way" of doing things in a situation like yours.
EDIT: (based on the first comment)
Second idea: you can use a custom function to at least make the multi-line repeated logic a bit more readable. Something like this, which returns the first "defined" argument, though with puppet, I am never sure what "defined" is (in this case, "undef" gets passed as an empty string to the function, which is still good enough).
You can then call it as many times as you want:
Since I posted this question oh those many years ago, Puppet's
stdlib
module has learned about the pick function, which will return the first non-undef
or non-empty value from a list of values. So one can write:There is also a
pick_default
function empty values are valid (you only want to ignoreundef
).