Você poderia usar o módulo puppet-concat do RIPienaar, onde você cria um único arquivo com muitos arquivos ou modelos menores.
A definição seria algo assim:
define host($address, $names) {
concat::fragment{"hosts-$address":
target => "/etc/hosts",
content => template("network/hosts_single.erb")
}
}
O modelo hosts_single.erb
representaria uma única linha no arquivo. Você provavelmente também adicionaria um fragmento para um cabeçalho e definiria order => "01"
para garantir que ele esteja no topo do arquivo gerado (10 é o padrão).