сохраненные конфигурации 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.