Назад | Перейти на главную страницу

Как использовать марионетки, сохраненные config и concat, для создания списка IP-адресов, разделенных точкой с запятой?

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

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

192.168.19.12;192.168.19.40;192.168.19.66

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

@@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

Я добился этого для 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 class и возвращают свои IP-адреса.

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