Verwenden von Ansible zum Bereitstellen einer Docker-Testumgebung und einfachem Ubuntu für die Produktion

Verwenden von Ansible zum Bereitstellen einer Docker-Testumgebung und einfachem Ubuntu für die Produktion

Ich brauche Hilfe bei der Bereitstellung eines Systems, an dem ich seit anderthalb Jahren arbeite. Damit Sie meine Bedenken verstehen, werde ich ein wenig über unsere Infrastruktur erklären.

Wir haben einen Server (nennen wir ihn TESTING_SERVER), auf dem wir verschiedene Testumgebungen für unser System haben. Jede dieser Umgebungen läuft vollständig mit Docker. Jede Instanz einer Testumgebung besteht aus: 1. Docker-Container mit Nginx als Proxy 2. Docker-Container mit einem Django-Web 3. Docker-Container mit MySQL

Jedes Mal, wenn wir zu Testzwecken eine neue Umgebung erstellen müssen (z. B.: die Qualitätssicherung möchte eine neue Funktion testen), verwenden wir ein Ansible-Playbook, das diese Aufgaben auf TESTING_SERVER ausführt:

  1. Erstellen Sie ein Docker-Netzwerk
  2. Datenbankcontainer erstellen
  3. Klonen oder aktualisieren Sie das Django-Git-Repository irgendwo in TESTING_SERVER
  4. Django-Container erstellen
  5. Führen Sie den Befehl „django collectstatic“ im Django-Container aus
  6. Führen Sie den Befehl „django migrate“ im Django-Container aus
  7. Nginx-Container erstellen

In unserer Produktionsumgebung haben wir einen einfachen Ubuntu-Server (PRODUCTION_SERVER), auf dem MySQL, Django und Nginx laufen. Jedes Mal, wenn wir in die Produktion einsteigen müssen, führen wir ein Ansible-Playbook aus, das die oben aufgeführten Schritte (fast) wiederholt:

  1. MySQL-Verbindung prüfen (Datenbank befindet sich auf einem anderen Server)
  2. Klonen oder aktualisieren Sie das Django-Git-Repository irgendwo im PRODUCTION_SERVER
  3. Gunicorn prüfen und neu starten (entspricht dem Erstellen eines Django-Containers)
  4. Führen Sie Django Collectstatic aus.
  5. Führen Sie Django migrate aus
  6. Überprüfen Sie die Nginx-Konfiguration

Diese beiden Playbooks sind unterschiedlich, obwohl sie viel gemeinsam haben. Ich dachte daran, jeden Schritt in eine Ansible-Aufgabe umzuwandeln und eine Bedingung zu verwenden, um zu wissen, welche Aufgaben (dockerisiert oder direkt) ausgeführt werden sollen. Aber ich werde immer noch unterschiedliche Aufgaben für jeden Schritt haben (dasselbe Playbook, aber scheint ein wenig knifflig zu sein).

Meine Frage ist: Gibt es eine Möglichkeit, diese Spielbücher so zu „verschmelzen“, dass wir nur eines haben, ohne uns zu wiederholen?

Antwort1

Ich würde pro „Aufgabe“ eine Rolle erstellen und diese im Playbook verwenden, ähnlich wie im Best-Practice-Dokument beschrieben.

http://docs.ansible.com/ansible/latest/playbooks_best_practices.html#directory-layout

Zum Beispiel

roles/  
  create_a_docker_network/  
    tasks/  
      main.yml  
  create_database_container/...
  ...  
  Create_nginx_container/

und im Spielbuch nennen die Rollen

testen.yml

- hosts: testserver
  roles:
    - create_a_docker_network
    - create_database_container
    - ...

verwandte Informationen