
configurações armazenadas da versão 2.7.18 do puppet (não puppetdb)
No meu caso, tenho 3 nós couchbase, que devem ser concatenados a uma string de conexão couchbase semelhante a esta:
192.168.19.12;192.168.19.40;192.168.19.66
então em cada servidor couchbase eu faço algo assim:
@@concat::fragment { "foo": target => '/tmp/foo', content => "$ipaddress", order => 1, }
e no servidor de aplicativos, que deve se conectar ao servidor couchbase, quero gerar um arquivo de configuração yaml parecido com este:
couchbase:
class: MyCouchbaseStorage
param:
connection: MyCouchbaseConnection
connection_param:
username: myusername
password: mypassword
bucket: mybucket
host: 192.168.19.12;192.168.19.40;192.168.19.66
persist: 1
todas, exceto as linhas do host, não são problema, mas a entrada do host é realmente complicada
eu concateno os hosts coletando-os com:
Concat::Fragment <<| tag == 'mycbtag' |>> { target => '/tmp/database.yml' }
então agora eu tenho o problema, não tenho ";" chamando concat assim
@@concat::fragment { "foo": target => '/tmp/foo', content => ";$ipaddress", order => 1, }
vai produzir:
host: ;192.168.19.12;192.168.19.40;192.168.19.66
chamando concat assim
@@concat::fragment { "foo": target => '/tmp/foo', content => "$ipaddress;", order => 1, }
vai produzir:
host: 192.168.19.12;192.168.19.40;192.168.19.66;
então, como modificar o conteúdo coletado ou como obtenho o resultado desejado?
host: 192.168.19.12;192.168.19.40;192.168.19.66
Responder1
Eu consigo isso para o Zookeeper usando o PuppetDB para recuperar os nós e um plugin personalizado para juntá-los. Os detalhes do uso do PuppetDB estão na resposta ao meupergunta original, e o plugin personalizado fica 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 em seu manifesto como esta:
$nodes = comma_join_nodes('Class[couchbase]', ipaddress)
Que usará o PuppetDB para encontrar todos os nós atribuídos à couchbase
classe e retornar seus endereços IP.
Observe que isso dispara paraconsistência eventual- será necessária uma execução para que todos os nós relatem ao PuppetDB que eles têm a couchbase
classe atribuída e somente na segunda execução todos eles se conectarão. Isso funciona bem para minha classe Zookeeper, mas suponho que pode não ser adequado para a classe Couchbase.