Как использовать конфигурацию и concat, сохраненные в Puppets, для генерации списка IP-адресов, разделенных точкой с запятой?

Как использовать конфигурацию и concat, сохраненные в Puppets, для генерации списка IP-адресов, разделенных точкой с запятой?

Сохраненные конфигурации puppet версии 2.7.18 (не puppetdb)

В моем случае у меня есть 3 узла Sofabase, которые должны быть объединены в строку подключения Sofabase, которая выглядит следующим образом:

192.168.19.12;192.168.19.40;192.168.19.66

поэтому на каждом сервере Sofabase я делаю что-то вроде этого:

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

и на сервере приложений, который должен подключаться к серверу Couchbase, я хочу сгенерировать файл конфигурации YAML, выглядящий следующим образом:

  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

все, кроме строк хоста, не представляет проблем, но запись хоста действительно сложная

Я объединяю хосты, собирая их с помощью:

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

так что теперь у меня проблема, что у меня нет ";", вызывающего concat таким образом

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

будет производить:

host:         ;192.168.19.12;192.168.19.40;192.168.19.66

вызывая concat таким образом

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

будет производить:

host:         192.168.19.12;192.168.19.40;192.168.19.66;

так как же изменить собранный контент или как получить желаемый результат?

host:         192.168.19.12;192.168.19.40;192.168.19.66

решение1

Я достигаю этого для Zookeeper, используя PuppetDB для извлечения узлов и пользовательский плагин для их объединения. Подробности использования PuppetDB в ответе на мойисходный вопрос, а пользовательский плагин выглядит так:

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

Это позволит вам создать в манифесте строку следующего вида:

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

Который будет использовать PuppetDB для поиска всех узлов, которым назначен couchbaseкласс, и возврата их IP-адресов.

Обратите внимание, что это стреляет дляконечная согласованность- потребуется запуск, чтобы все узлы сообщили PuppetDB, что им couchbaseназначен класс, и только при втором запуске они все подключатся. Это отлично работает для моего класса Zookeeper, но, полагаю, может не совсем подойти для класса Couchbase.

Связанный контент