¿Cómo utilizar la configuración almacenada de títeres y concat para generar una lista de direcciones IP separadas por punto y coma?

¿Cómo utilizar la configuración almacenada de títeres y concat para generar una lista de direcciones IP separadas por punto y coma?

Configuraciones almacenadas de la versión 2.7.18 de Puppet (no PuppetDB)

En mi caso, tengo 3 nodos de base de sofá, que deberían concatenarse a una cadena de conexión de base de sofá que se ve así:

192.168.19.12;192.168.19.40;192.168.19.66

Entonces en cada servidor Couchbase hago algo como esto:

@@concat::fragment { "foo": target => '/tmp/foo', content => "$ipaddress", order => 1, }

y en el servidor de aplicaciones, que debería conectarse al servidor Couchbase, quiero generar un archivo de configuración yaml con este aspecto:

  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 excepto las líneas del host no son un problema, pero la entrada del host es realmente complicada

Concateno los hosts recogiéndolos con:

Concat::Fragment <<| tag == 'mycbtag' |>> { target => '/tmp/database.yml' }

entonces ahora tengo el problema de que no tengo ";" llamando a concat así

@@concat::fragment { "foo": target => '/tmp/foo', content => ";$ipaddress", order => 1, }

Producirá:

host:         ;192.168.19.12;192.168.19.40;192.168.19.66

llamando a concat así

@@concat::fragment { "foo": target => '/tmp/foo', content => "$ipaddress;", order => 1, }

Producirá:

host:         192.168.19.12;192.168.19.40;192.168.19.66;

Entonces, ¿cómo modificar el contenido recopilado o cómo obtengo el resultado deseado?

host:         192.168.19.12;192.168.19.40;192.168.19.66

Respuesta1

Logré esto para Zookeeper usando PuppetDB para recuperar los nodos y un complemento personalizado para unirlos. Los detalles sobre el uso de PuppetDB se encuentran en la respuesta a mipregunta original, y el complemento personalizado se ve así:

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

Esto debería permitirle crear una cadena en su manifiesto como esta:

$nodes = comma_join_nodes('Class[couchbase]', ipaddress)

Que utilizará PuppetDB para encontrar todos los nodos asignados a la couchbaseclase y devolver sus direcciones IP.

Tenga en cuenta que esto apunta aconsistencia final- Se necesitará una ejecución para que todos los nodos informen a PuppetDB que tienen la couchbaseclase asignada, y solo en la segunda ejecución se conectarán todos. Esto funciona bien para mi clase Zookeeper, pero supongo que puede que no sea adecuado para la de Couchbase.

información relacionada