марионеточная версия 2.7.18 сохранила конфигурации (не puppetdb)
Я мой случай, у меня есть 3 couchbase узла, которые должны быть concated к 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 хосты путем сбора их с:
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
, и вернуть их IP-адреса.
Обратите внимание, что это способствует конечной согласованности - все узлы будут запущены для сообщить PuppetDB, что им назначен класс couchbase
, и только при втором запуске они все подключатся. Это отлично работает для моего класса Zookeeper, но, полагаю, может не совсем подходить для класса Couchbase.