
Gespeicherte Konfigurationen in Puppet-Version 2.7.18 (nicht PuppetDB)
In meinem Fall habe ich 3 Couchbase-Knoten, die zu einer Couchbase-Verbindungszeichenfolge verknüpft werden sollten, die wie folgt aussieht:
192.168.19.12;192.168.19.40;192.168.19.66
also mache ich auf jedem Couchbase-Server so etwas:
@@concat::fragment { "foo": target => '/tmp/foo', content => "$ipaddress", order => 1, }
und auf dem App-Server, der eine Verbindung zum Couchbase-Server herstellen soll, möchte ich eine YAML-Konfigurationsdatei generieren, die so aussieht:
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
alle Zeilen außer den Hostzeilen sind kein Problem, aber die Hosteingabe ist wirklich knifflig
ich verkette die Hosts, indem ich sie sammle mit:
Concat::Fragment <<| tag == 'mycbtag' |>> { target => '/tmp/database.yml' }
also jetzt habe ich das Problem, dass ich kein ";" habe, wenn ich concat so aufrufe
@@concat::fragment { "foo": target => '/tmp/foo', content => ";$ipaddress", order => 1, }
wird herstellen:
host: ;192.168.19.12;192.168.19.40;192.168.19.66
concat so aufrufen
@@concat::fragment { "foo": target => '/tmp/foo', content => "$ipaddress;", order => 1, }
wird herstellen:
host: 192.168.19.12;192.168.19.40;192.168.19.66;
Wie ändere ich also den gesammelten Inhalt bzw. wie erhalte ich das gewünschte Ergebnis?
host: 192.168.19.12;192.168.19.40;192.168.19.66
Antwort1
Ich erreiche dies für Zookeeper, indem ich PuppetDB verwende, um die Knoten abzurufen, und ein benutzerdefiniertes Plugin, um sie zu verbinden. Die Details zur Verwendung von PuppetDB finden Sie in der Antwort auf meineursprüngliche Frage, und das benutzerdefinierte Plugin sieht folgendermaßen aus:
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
Dies sollte es Ihnen ermöglichen, in Ihrem Manifest eine Zeichenfolge wie die folgende zu erstellen:
$nodes = comma_join_nodes('Class[couchbase]', ipaddress)
Dadurch wird PuppetDB verwendet, um alle Knoten zu finden, denen die couchbase
Klasse zugewiesen ist, und ihre IP-Adressen werden zurückgegeben.
Beachten Sie, dass dies zielt aufletztendliche Konsistenz- Es dauert einen Durchlauf, bis alle Knoten PuppetDB melden, dass ihnen die couchbase
Klasse zugewiesen wurde, und erst beim zweiten Durchlauf werden sie alle verbunden. Das funktioniert gut für meine Zookeeper-Klasse, aber ich nehme an, dass es für die Couchbase-Klasse nicht ganz geeignet ist.