Drei Lösungen zur Strukturierung einer Bereitstellung mit Ansible?

7

Ich stelle derzeit ein neues Produkt bereit und bin auf einige Probleme bei der Strukturierung meines Playbooks und meiner Rollen gestoßen. Ich habe drei verschiedene Lösungen und hoffe, einen Input zu bekommen, welcher Weg der beste sein könnte.

Das Produkt ist eine Webanwendung auf einem Windows-Server. Die folgenden Schritte sind für die Bereitstellung erforderlich (hohe Ebene):

  • installiere javajdk
  • Tomcat installieren
  • Installieren Sie win_service
  • Java Regkes konfigurieren
  • Tomcat konfigurieren
  • Installieren Sie die Webanwendung
  • Dienst starten

Ich benutze statische Inventare für Prod und Staging, group_vars, Rollen (erstellt mit ansible-galaxy), damit es eine Art Struktur gibt.


Lösung 1 Legen Sie alles in ein riesiges Spielbuch. Das hört sich nicht gut an, hat aber den Vorteil, dass Sie die Variablen aus früheren Installationen kennen, z. B. tomcatwissen müssen, wo JAVA_HOMEsich ... das war bei der javajdkInstallation, da mehr als ein Java auf den Maschinen vorhanden ist, gibt es kein globales JAVA_HOME...


Lösung 2 Brechen Sie alles in kleinen Rollen aus. Klingt gut, aber die Rollen sollten unabhängig voneinander sein. Ich habe keine Methode gefunden, um Aufgaben zu entkoppeln. Wäre es sinnvoll zB für einzelne Rollen zu haben install_tomcat, config_tomcatund ein Textbuch eingerichtet, die die genannten Rollen in Folge hat?

Aber woher weiß eine Rolle, z. B. einen Pfadnamen, der in der nächsten Rolle benötigt wird? -> Die Installation legt den Pfad fest, den die Konfiguration kennen muss. Ich bin mir nicht sicher, ob ich Rollen unabhängig machen soll.


Lösung 3 Art der Lösung 2. Haben Sie ein Hauptspielbuch, das nur Rollen enthält, und teilen Sie es so weit wie möglich in Rollen auf. Haben Sie unabhängige Variablennamen in./roles/vars/main.yml

Irgendwie (?) Finden Sie einen höheren Platz in der variablen Priorität des Playbooks, wo alle erforderlichen varDefinitionen abgelegt werden. Intern entweder eine Variable zur Rolle führen oder eine Rollenvariable einfach überschreiben.

Wenn ein Produkt beispielsweise einen Service hat, ist der Servicename im Allgemeinen Teil eines Pfadnamens für tomcat. Der tomcatName sollte nicht vom Service abhängen, daher sollte es einen tomcat_install_pathin der Rolle geben, aber auch einen service_namemit dem Produkt. Wenn also das Playbook für das Produkt heißt, dass der Dienstname Teil des Namens sein sollte, sollte der Name tomcat_installmit einer völlig anderen Bereitstellung aufgerufen werden, und es sollte kein Fummeln mit einem Dienstnamen erfolgen.


Ich würde mit Lösung 3 gehen, aber ich habe noch keinen Weg gefunden, dies einzurichten. Was ist die Meinung der Experten, ist Lösung 3 machbar, ist eine der anderen einmal besser oder gibt es eine vierte Lösung?

MBushveld
quelle

Antworten:

3

Ich würde empfehlen, den Code so zu strukturieren, wie er im Ansible Best Practices-Dokument definiert ist :

Geben Sie hier die Bildbeschreibung ein

und der Struktur zu folgen, die Hauptverantwortliche für die Ansible-Galaxy-Plattform wie Geerlingguy verwenden .

Wenn man einer signifikant anderen Struktur folgt, wird es in Zukunft sehr schwierig sein, Rollen aus der Ansible-Galaxy- Community wiederzuverwenden , und man muss das Rad neu erfinden.

030
quelle
Vielen Dank. Und konkret in Bezug auf meine Frage: Wie werden Sie z. B. die Javajdk-Installation entkoppeln und wiederverwenden und die Wiederverwendung in einer Tomcat-Installation? Wenn sie entkoppelt sind, müssen die Variablen, z. B. pat to javaddk, "in" der Rolle sein. Wie gehen Sie damit in einer Tomcat-Installation um, ohne die Variablen überall zu ändern? Gibt es ein gemeinsames Konzept für die Verwendung variabler Priorität? Ist so was?
MBushveld
Ich würde ansible galaxy überprüfen und eine jdk- und tomcat-Rolle installieren. Ich werde selbst keine Rolle schreiben, es sei denn, sie ist nicht verfügbar. Zum Beispiel github.com/silpion/ansible-tomcat undansiblebit.oracle-java
030
Beachten Sie, dass ich die Tomcat-Rolle nicht getestet habe. Sie können die Tomcat-Rolle lokal testen. Wenn das nicht funktioniert, können Sie eine andere Katerrolle aus der Galaxie verwenden.
030
1

Kurze Antwort: Sie programmieren hier. Betrachten Sie Programmierstandards (Cleancode) wie "Paket für Feature" und erstellen Sie eine Rolle, die wiederverwendbar ist und den Grund der Rolle ausdrückt. z.B

roles:
  - role: jdk
  - role: tomcat  
      (contains tasks with 'install tomcat', 'configure tomcat' ) 
      (requires jdk)
  - role: the_wepapp 
      (requires tomcat)

Weiter: Die zugrunde liegende Rolle, z. B. der JDK, sollte niemals etwas über die Tomcat-Rolle usw. wissen.

schmichri
quelle