Eu consegui isso para o Zookeeper usando PuppetDB para recuperar os nós e um plugin personalizado para se juntar a eles. Os detalhes do uso do PuppetDB estão na resposta à minha pergunta original e o plug-in personalizado é assim:
require 'puppet/face'
module Puppet::Parser::Functions
newfunction(:comma_join_nodes, :type => :rvalue) do |args|
query = args[0]
fact = args[1]
q = Puppet::Face[:query, :current].facts(query)
return q.each_value.collect { |facts| facts[fact] }.sort.join(',')
end
end
Isso deve permitir que você crie uma string no seu manifesto assim:
$nodes = comma_join_nodes('Class[couchbase]', ipaddress)
O qual usará o PuppetDB para encontrar todos os nós atribuídos à classe couchbase
e retornará seus endereços IP.
Observe que isso acontece para consistência eventual - será necessário executar todos os nós para informar ao PuppetDB que eles têm a classe couchbase
atribuída e, somente na segunda execução, todos eles conectar. Isso funciona bem para a minha classe Zookeeper, mas eu suponho que pode não ser adequado para a classe Couchbase.