Optionen für Multisite-Hochverfügbarkeit mit Puppet


14

Ich unterhalte zwei Rechenzentren, und da immer mehr unserer wichtigen Infrastrukturen über Marionetten gesteuert werden, ist es wichtig, dass die Marionettenmeister am zweiten Standort arbeiten, falls unser Hauptstandort ausfällt.

Noch besser wäre eine Art Aktiv / Aktiv-Einrichtung, damit die Server am zweiten Standort nicht über das WAN abfragen.

Gibt es Standardmethoden für die Hochverfügbarkeit von Marionetten mit mehreren Standorten?


1
Habe ich deine Frage richtig verstanden? Sie suchen nach einer Möglichkeit, einen redundanten Puppenspieler zu haben, falls der Puppenspieler nicht verfügbar ist?
Hrvoje Špoljar

Es hängt ein bisschen davon ab, wie Sie Marionette verwenden. Es gibt viel Flexibilität. Verwenden Sie beispielsweise gespeicherte Konfigurationen?
Zoredache

3
Hast du dir "masterless puppet" angesehen? Das Wesentliche dabei ist, dass jeder Agent die Manifeste überprüft und lokal anwendet. Sie am Ende mit gitoder svnoder rsyncoder was auch immer Versionskontrollsystem verwenden Sie das , was Sie brauchen , eher zu skalieren als der Puppenspieler.
Ladadadada

3
Nur ein Hinweis zur Lösung der Aktiv-Aktiv-Frage: Sie können Anycast verwenden, um dieselbe ( "virtuelle" / "Dienst-" ) IP von beiden Rechenzentren anzukündigen. Wir tun dies für die Auflösung von DNS-Servern. In jedem Rechenzentrum geben unsere Loadbalancer dieselbe Anycast-IP bekannt. Unser Routing bevorzugt den lokalen Loadbalancer, greift aber im Fehlerfall auf die anderen DCs zurück (~ "Anycast-IP nicht mehr ankündigen").
Michuelnik

1
Ich sehe, dass eine der neuen Funktionen für Puppet 3.0 die Unterstützung von SRV- Datensätzen ist , etwas, mit dem Windows-Leute gut vertraut sind und das bei Site-Dingen helfen könnte.
sysadmin1138

Antworten:


13

Puppet eignet sich eigentlich ziemlich gut für Umgebungen mit mehreren Mastern, mit Vorbehalten. Der wichtigste? Viele Teile von Puppet möchten zentralisiert werden. Die Zertifizierungsstelle, die Inventarisierungs- und Dashboard- / Berichtsservices, das Filebucketing und gespeicherte Konfigurationen - alle sind am besten in einem Setup (oder benötigen es einfach), in dem es nur einen Ort gibt, an dem sie sich unterhalten können.

Es ist jedoch durchaus praktikabel, viele dieser sich bewegenden Teile in einer Umgebung mit mehreren Mastern zum Laufen zu bringen, wenn Sie mit dem Verlust einiger Funktionen einverstanden sind, wenn Sie Ihre primäre Site verloren haben.


Beginnen wir mit der Basisfunktionalität, um einen Knoten an einen Master zu melden:

Module und Manifeste

Dieser Teil ist einfach. Versionskontrolle sie. Wenn es sich um ein verteiltes Versionskontrollsystem handelt, zentralisieren und synchronisieren Sie es einfach und ändern Sie Ihren Push / Pull-Fluss nach Bedarf auf der Failover-Site. Wenn es sich um Subversion handelt, möchten Sie wahrscheinlich svnsyncdas Repo auf Ihre Failover-Site durchführen.

Zertifizierungsstelle

Eine Möglichkeit besteht darin, die Zertifizierungsstellendateien einfach zwischen den Mastern zu synchronisieren, sodass alle dasselbe Stammzertifikat verwenden und Zertifikate signieren können. Das hat mich immer als "falsch gemacht" empfunden;

  • Sollte ein Master wirklich sein eigenes Zertifikat in der Client-Authentifizierung für eine eingehende Verbindung von einem anderen Master als gültig anzeigen?
  • Funktioniert das zuverlässig für den Inventarservice, das Dashboard usw.?
  • Wie können Sie später weitere gültige DNS-ALT-Namen hinzufügen?

Ich kann nicht ehrlich sagen, dass ich diese Option gründlich getestet habe, da sie schrecklich erscheint. Puppet Labs scheinen diese Option jedoch nicht zu fördern, wie in der Anmerkung hier angegeben .

Sie müssen also einen zentralen CA-Master haben. Alle Vertrauensstellungen funktionieren weiterhin, wenn die Zertifizierungsstelle inaktiv ist, da alle Clients und anderen Master das Zertifizierungsstellenzertifikat und die Zertifikatsperrliste zwischenspeichern (obwohl sie die Zertifikatsperrliste nicht so oft aktualisieren, wie sie sollten). Sie können jedoch erst neue Zertifikate signieren Sie sichern den primären Standort oder stellen den CA-Master von Sicherungen am Failover-Standort wieder her.

Sie wählen einen Master als CA aus und lassen ihn von allen anderen Mastern deaktivieren:

[main]
    ca_server = puppet-ca.example.com
[master]
    ca = false

Dann möchten Sie, dass dieses zentrale System den gesamten zertifikatsbezogenen Datenverkehr abruft. Hierfür gibt es einige Optionen.

  1. Verwenden Sie die SRVUnterstützung für neue Datensätze in 3.0, um alle Agentenknoten auf die richtige Stelle für die Zertifizierungsstelle zu verweisen._x-puppet-ca._tcp.example.com
  2. Richten Sie die ca_serverKonfigurationsoption in puppet.confallen Agenten ein
  3. Übertragen Sie den gesamten Verkehr für CA-bezogene Anforderungen von Agenten an den richtigen Master. Wenn Sie beispielsweise alle Master in Apache über Passenger ausführen, konfigurieren Sie dies auf den Nicht-CAs:

    SSLProxyEngine On
    # Proxy on to the CA.
    ProxyPassMatch ^/([^/]+/certificate.*)$ https://puppet-ca.example.com:8140/$1
    # Caveat: /certificate_revocation_list requires authentication by default,
    # which will be lost when proxying. You'll want to alter your CA's auth.conf
    # to allow those requests from any device; the CRL isn't sensitive.
    

Und das sollte es tun.


Bevor wir zu den Nebendienstleistungen übergehen, eine Randnotiz;

DNS-Namen für Master-Zertifikate

Ich denke, das hier ist der überzeugendste Grund, auf 3.0 umzusteigen. Angenommen, Sie möchten einen Knoten auf "einen alten Arbeitsmaster" verweisen.

Unter 2.7 benötigen Sie einen generischen DNS-Namen puppet.example.com, und alle Master benötigen diesen in ihrem Zertifikat. Das bedeutet Einstellung dns_alt_namesin ihrer Konfiguration, Re-Ausgabe das CERT , dass sie hatten , bevor sie als Master konfiguriert wurden, erneut die Ausgabe wieder das CERT , wenn Sie einen neuen DNS - Namen in die Liste hinzufügen müssen (wie , wenn Sie mehr DNS - Namen wollten Agenten bevorzugen Master in ihrer Site) .. hässlich.

Mit 3.0 können Sie SRVDatensätze verwenden. Geben Sie all Ihren Kunden dies;

[main]
    use_srv_records = true
    srv_domain = example.com

Dann werden für die Master keine speziellen Zertifikate benötigt - fügen Sie einfach einen neuen Datensatz zu Ihrer SRVRR hinzu _x-puppet._tcp.example.comund schon ist es ein Live-Master in der Gruppe. Besser noch, Sie können die Master-Auswahllogik auf einfache Weise verfeinern. "Jeder alte Arbeitsmeister, aber bevorzugen Sie den in Ihrer Site", indem Sie verschiedene SRVDatensätze für verschiedene Sites einrichten. nicht dns_alt_namesbenötigt.


Berichte / Dashboard

Dieser funktioniert am besten zentral, aber wenn Sie bei Ausfall Ihrer primären Site darauf verzichten können, ist dies kein Problem. Konfigurieren Sie einfach alle Ihre Master mit der richtigen Position, um die Berichte zu platzieren.

[master]
    reports = http
    reporturl = https://puppetdash.example.com/reports/upload

..und Sie sind fertig. Das Fehlschlagen des Uploads eines Berichts ist für den Konfigurationslauf nicht schwerwiegend. Es geht nur verloren, wenn der Toast des Dashboard-Servers erfolgt.

Fact Inventory

Eine weitere schöne Sache, die Sie in Ihr Dashboard geklebt haben, ist der Inventarservice. Mit dem facts_terminusSatz , restwie in der Dokumentation empfohlen, würde dies tatsächlich Konfiguration läuft brechen , wenn der zentrale Bestands Dienst nicht verfügbar ist. Der Trick dabei ist, den inventory_serviceTerminus auf den nicht zentralen Mastern zu verwenden, was ein elegantes Versagen ermöglicht.

facts_terminus = inventory_service
inventory_server = puppet-ca.example.com
inventory_port = 8140

Stellen Sie Ihren zentralen Inventarserver so ein, dass die Inventardaten entweder über ActiveRecord oder PuppetDB gespeichert werden. Er sollte immer auf dem neuesten Stand sein, wenn der Dienst verfügbar ist.


Also - wenn Sie mit einer hübschen Konfigurationsverwaltungsumgebung mit Barebones zufrieden sind, in der Sie nicht einmal die Zertifizierungsstelle verwenden können, um das Zertifikat eines neuen Knotens zu signieren, bis es wiederhergestellt ist, kann dies gut funktionieren - auch wenn es wirklich nett wäre wenn einige dieser Komponenten ein wenig vertriebsfreundlicher wären .


1
+1 für das CA-Zeug. Beachten Sie, dass Sie alle CA-Goodies synchronisieren / versionieren können und einfach keine davon auf den "Standby" -Puppenmeistern aktivieren können, bis eine Failover-Situation eintritt (zu diesem Zeitpunkt stellen Sie die CA-Bits auf Ihrem neuen "Master" auf und aktualisieren den SRVDatensatz dementsprechend - SRVRekorde erscheinen mir hier trotz meiner allgemeinen Ambivalenz gegenüber als die eleganteste Lösung ...)
voretaq7

1
@ voretaq7 Das ist ein guter Punkt - ein reines Failover-Setup wäre viel weniger aufwändig als diese Art der aktiven / aktiven Bereitstellung.
Shane Madden

2
Als Ergänzung habe ich auch ein Update zum Multi-Master-Skalierungshandbuch in den Puppet Docs beigesteuert,
Shane Madden

8

Der von Ladadadada beschriebene "masterless puppet" -Ansatz ist der, mit dem ich am vertrautesten bin (im Grunde ist es das, was wir mit radmind in meiner Firma machen). Genauer gesagt handelt es sich um "Mehrere Master, die durch einen externen Prozess synchronisiert werden", bei dem jeder Server (theoretisch) im Notfall unser gesamtes Universum bedienen kann.

In unserem Fall werden aufgrund der Natur von Radmind einfach rsyncdie Transkripte und Datendateien von einem genehmigten Master auf den Radmind-Server jedes Remotestandorts übertragen, und Clients rufen ihre Aktualisierungen mit einem kurzen Hostnamen vom Server ab radmind(durch die Magie wird resolv.confdies zu radmind.[sitename].mycompany.com- immer dem lokalen ausgewertet) Wenn der lokale Server nicht verfügbar ist, können Sie ihn leicht überschreiben und auf den Server einer anderen Site verweisen.

Diese Art von rsync-Prozess würde wahrscheinlich auch in Ihrer Situation funktionieren, ist aber im Vergleich zu einer versionskontrollbasierten Lösung möglicherweise nicht optimal.


Für Puppets oder Küchenchefs ist ein versionskontrollbasiertes System aus mehreren Gründen sinnvoller als einfaches rsync - das große Problem ist, dass Sie versionskontrollierende Puppetskripte verwenden (und nicht wie bei radmind ganze Betriebssystem-Images).
Als zusätzlichen Vorteil der versionskontrollbasierten Verwaltung können Sie mehrere Personen gleichzeitig am Repository arbeiten lassen (großartiger Gewinn für Parallelität). Sie erhalten den Revisionsverlauf im Wesentlichen kostenlos, und wenn jemand die Puppet-Umgebung bricht, haben Sie ein einfaches Rollback (vorausgesetzt, Sie " bei der verwendung githast du auch git blamewas drauf hat).
Durch kreatives Verzweigen und Zusammenführen können Sie sogar ein umfangreiches Betriebssystem-Upgrade oder einen anderen Übergang innerhalb des Versionskontroll-Frameworks bewältigen. Sobald Sie es richtig verstanden haben, wechseln Sie einfach in den neuen Zweig und (hoffentlich) der Produktionsschub wird einfach funktionieren.

Würde ich dies hier implementieren, würde ich wahrscheinlich die Vorteile von Pre-Commit- und Post-Commit-Hooks in git nutzen, um sicherzustellen, dass die Puppet-Konfigurationen, für die ein Commit durchgeführt wird, vernünftig sind (clientseitig vorab), und sie an den Rest des Universums weiterleiten, falls dies der Fall ist are (serverseitiger Post - löst möglicherweise auch ein Umgebungsupdate aus, wenn Ihre Bereitstellungsrichtlinien ein solches Verhalten zulassen).

Wenn Sie an jedem Standort neue Puppetmaster-Server einrichten möchten, können Sie einfach die Puppet-Umgebung für jeden entfernten Puppetmaster überprüfen und entweder die oben beschriebene Hacker-Funktion resolv.conf / hostname oder IPs von Anycast-Diensten verwenden, die an lokale Systeme wie Michuelnik weitergeleitet werden ( Letzteres ist praktisch, wenn Sie ein automatisches Failover wünschen, wenn der Puppenmeister einer Site in die Luft sprengt, um sicherzustellen, dass jede Site den "richtigen" Puppenmeister sieht und Ihre WAN-Links nicht verstopft, um Aktualisierungen zu erhalten.


Die Leute bei Brain Tree Payments haben anscheinend die Lösungen für Versionskontrolle und rsync mit einigen benutzerdefinierten Capistrano-Aufgaben kombiniert - ihre Lösung scheint in dem Sinne halbherzig zu sein, dass sie immer noch auf manuellen Workflow-Elementen beruht, aber angepasst und automatisiert werden könnte zu viel Arbeit.
Der paranoide Zwangstester in mir hat eine Vorliebe für seinen noopSanity-Check-Schritt - der Hasser der manuellen Prozesse in mir wünscht sich ein gewisses Maß an Automatisierung ...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.