Unsere eigene Software mit Puppet bereitstellen?

Unsere eigene Software mit Puppet bereitstellen?

(Ich entschuldige mich schon mal für die Dummheit dieser Frage. Normalerweise bin ich Programmierer und kein Systemadministrator, aber ich habe es mir zur Aufgabe gemacht, einige Dinge zu automatisieren und andere Dinge zu bereinigen, die zwar automatisiert sind, aber nicht auf die schönste Art und Weise. :-)

Ich habe mir verschiedene Tools zur Automatisierung der Softwarebereitstellung auf einer Reihe von Servern angesehen, beispielsweise cfengine, Puppet und Chef. Bisher sieht Puppet am ansprechendsten aus, aber ich habe mich noch nicht auf etwas festgelegt.

Diese Tools scheinen alle sehr gut dazu geeignet zu sein, eine Reihe von Servern auf dem neuesten Stand zu halten.vorverpacktSoftware.

Was ich nicht verstehe, ist: Wie verwendet man ein Tool (wie Puppet), um die Bereitstellung unserer eigenen internen Software zu verwalten? Ich glaube, ich bin ratlos, weil ich tausend Tutorials gesehen habe, die zeigen, wie man Apache ensure => latest(dasIstziemlich cool), aber nichts, was ganz meinem heutigen Anwendungsfall entspricht, der eher so aussieht:

  1. wenn ein Mensch den Knopf drückt,
  2. Pullen Sie Zweig A aus dem Versionskontroll-Repository B.
  3. Führen Sie den Befehl C aus, um es zu kompilieren
  4. Kopieren Sie die Binärdateien D auf die Server E1 bis E10
  5. Führen Sie auf jedem Server den Befehl F aus, damit alle Änderungen wirksam werden

Puppet klingt großartig und ich sehe durchaus den Vorteil einer deklarativen, idempotenten Konfiguration gegenüber einigen Shell-Skripten, aber ich habe keine Tutorials für „Sie möchten Ihre Shell-Skripte auf Puppet (oder Chef oder cfengine) aktualisieren, also sollten Sie Folgendes tun“ gesehen. Gibt es so etwas? Ist es für andere Leute offensichtlich, wie sie die in den Puppet-Dokumenten bereitgestellten Dinge nehmen und das gewünschte Verhalten reproduzieren können? Verstehe ich es einfach nicht?

Bisher klingt es für mich so, als würde der Mensch (#1) die Software (#2 und #3) manuell außerhalb von Puppet verpacken und die Puppet-Konfiguration manuell aktualisieren, was Puppet dazu veranlassen würde, die Server zu aktualisieren ... vielleicht? (Ich bin hier ein wenig verwirrt, wie Sie sicher merken.)

Danke!

Antwort1

Wir verwenden Puppet, aber nicht für die Bereitstellung unserer Anwendungen. Wie Sie sagten, könnten Sie Ihre Software in Debs oder RPMs verpacken, Ihr privates Repository überall konfigurieren und Puppet zur Versionskontrolle verwenden, aber Sie sind trotzdem darauf angewiesen, auf allen Ihren Servern auf die nächste 30-minütige Aktualisierung zu warten.

Was ich tun würde (und das kommt dem, was wir tun, sehr nahe, aber wir verwenden Rails, sodass kein Kompilierungsschritt erforderlich ist):

  • Verwenden Sie Puppet, um alles auf dem Server außer der Anwendung selbst zu konfigurieren. Abhängigkeiten, Webserver, Benutzer, Pfade usw.
  • Lassen Sie Ihren automatisierten Build-Server (Bamboo, Hudson, Cruise Control usw.) die kompilierten Artefakte in einem Repository-Manager wie Nexus ablegen.
  • Verwenden Sie Capistrano, um den Build auf Ihre Server zu übertragen.

Chef verfügt möglicherweise über mehr Push-Funktionen in Echtzeit. Ich bin damit nicht sehr vertraut.

Antwort2

Die Schritte 1 bis 3 werden in einem Build-Prozess normalerweise automatisiert. Normalerweise durchläuft die Ausgabe dieses Prozesses einen Testzyklus. Ich verpacke die Ausgabe so, dass sie in einer Integrationstestumgebung bereitgestellt werden kann. Nur wenn die Integrationstests erfolgreich sind, sollten die Schritte 4 und 5 ausgeführt werden.

Ihr Schritt 5 impliziert einen Bereitstellungsausfall. Bei etwas wie Apache kann dies durch Herunterfahren und Neustarten während der Protokollrotation behandelt werden. Ein Crontab-Skript kann dies handhaben. Wenn Sie fortlaufende Änderungen über einen Zeitraum von etwa einer Stunde handhaben können, schließen Sie den Neustart einfach in Bereitstellungsschritt 4 ein. Puppet oder cfengine sind geeignete Tools für Schritt 4. Dies kann durch Aktualisieren des Repositorys ausgelöst werden, wenn die Integrationstests erfolgreich sind.

Antwort3

Suchen Sie nach Puppet-Rezepten und Sie werden Unmengen produktionsreifer Skripte finden. Ja, Sie müssen die Software manuell verpacken. Wenn Sie Ihr eigenes persönliches Repository verwalten, können Sie das Flag Ensure=>latest verwenden. Schreiben Sie dann ein Rezept, um Puppet anzuweisen, die Software zu installieren. Das Rezept muss auf dem Master-Server abgelegt werden, von wo aus es an die Slaves weitergegeben wird.

verwandte Informationen