However, it doesn't seem that it's possible to use a variable in the function call (please correct me if I am wrong). There's also the problem that a site-specific template must exist.
É possível usar uma variável na chamada de função, mas lembre-se de que seu argumento de função é uma sequência de rubis, não um modelo de marionete. Você poderia fazer isso:
<%= scope.function_template("sites/" + domain + "/config.erb") %>
Ou use a substituição de string do Ruby:
<%= scope.function_template("sites/#{domain}/config.erb") %>
... mas isso ainda produzirá um erro caso o modelo definido não exista.
Para evitar o erro, você pode usar o mecanismo de tratamento de exceções do Ruby dentro do seu modelo, assim:
<%=
begin
scope.function_template("sites/#{domain}/config.erb")
rescue
end
%>
Ta da! Pode haver uma maneira melhor de fazer isso; Não sou nem um especialista Ruby nem um Puppet, e acabei de inventar isso agora.