1

Es scheint, dass es in der ansible Welt ein bisschen zu viele Möglichkeiten gibt, mit dem Inventar umzugehen, und wir standen vor einigen schwierigen Fragen.Wie kann man Inventar mit mehreren Umgebungen skalierbar und flexibel verwalten?

Wir haben derzeit 4 offizielle Zielumgebungen: Produktion, Staging, Test und lokal (localhost). Jetzt sind sie alle Gruppen von Hosts in einer einzigen inventory.ini, die sich im Root befindet.

Fast die gesamte Infrastruktur wird auf AWS ausgeführt. Die einzige Ausnahme ist, dass einige Entwickler ihre lokale Umgebung auf localhost oder einer lokalen VM ausführen. Alle anderen nicht-persönlichen Umgebungen sind jedoch auf AWS.

Einige Mitarbeiter möchten diese in verschiedene Inventare für jede Umgebung aufteilen, um eine versehentliche Ausführung gegen alle auf einmal zu vermeiden. Ich bin ein bisschen besorgt, dass dies die Wartungskosten erhöhen könnte, und das wird es wahrscheinlich schwieriger machen, mit Werkzeugen wie Ansible Tower, Semamphore oder RunDeck zu arbeiten. Ich möchte auch auf dynamisches ec2-Inventar umstellen, was die Aufteilung weniger interessant macht.

Hier sind einige Fragen, die durch eine optimale Setup zu addresed haben:

  • Wie stelle ich eine bestimmte Komponente zu einer bestimmten Umgebung?
  • Wie kann ich ein Playbook testen, ohne die Produktion oder das Staging zu beeinflussen?
  • welche Standardwert sollte er als halten „hosts: value“ in unserem Playbooks
  • was die Standard-Inventar sein sollte, wenn wir mehrere Dateien
  • verwenden würden, wie wir etwas gegen die gesamte Infrastruktur (mehrere Vorräte an der bereitstellen können gleiche Zeit)
+1

Unabhängig von meiner Antwort denke ich, dass die Zielumgebung nichts mit einem Playbook zu tun hat. Es sollte immer eine additive Information sein, die Sie explizit angeben sollten. –

Antwort

1

Ich denke, es ist Zeit für eine dynamische Bestandsaufnahme. Ich sah mich einem ähnlichen Problem gegenüber, bei dem ich drei Umgebungen für die Bereitstellung und eine einzelne Inventardatei bereitstellen musste. Ich habe es gelöst, indem ich alle Hosts in einer Datenbank gespeichert habe (in meinem Fall MongoDB) und dann ein dynamisches Inventar erstellt habe, um die Hostliste zu erstellen. Die Auswahl der Umgebung erfolgte durch Hinzufügen einer env-Variablen vor dem Aufruf von ansible (etwas wie environ=PROD ansible-playbook -i inventory ..). Es gab auch ein wenig Logik in der Bestandsliste, um zu vermeiden, dass jemand in der Produktion (UID/GID-basiert) eingesetzt wurde. Um Ihre Fragen zu beantworten:

  • Sie verschiedene Möglichkeiten nutzen können, dies zu tun, eine Umgebungsvariable und ein dynamisches Inventar, separate Inventardateien verwenden, oder ein einzelnes Inventar verwenden und die Gruppen nennen (prod|dev|staging)_<hostgroup>
  • Das hängt ganz davon ab, wie Sie wählen, verwalten Das Inventar
  • In einem Playbook gibt es keinen Standardwert für - hosts:. Wählen Sie nur die Hosts aus Du brauchst das richtige Inventar.
  • Der Standardwert hängt davon ab, was Sie entscheiden, aber ich würde sagen, verwenden Sie nicht die Produktion als Standard .. Nicht die sicherste Sache, vielleicht Dev als Standard verwenden?
  • Verwenden Sie einfach -i inventory_dir/. Sie können ein Verzeichnis an -i übergeben. Ansible liest alle Dateien und führt alle -x Dateien aus.
+0

Danke für die Eingabe. Dennoch gibt es einige Dinge, die ich nicht vollständig verstehe: Warum haben Sie unterschiedliche Inventare, wenn Sie eine Umgebungsvariable verwenden? Warum ordnen Sie die Umgebung nicht über eine Gruppe im Inventar selbst zu? In Bezug auf keinen Standardwert für Hosts innerhalb des Playbooks ... etwas komisch, mein Instinkt würde mir sagen, dass ich dort eine Gruppe angeben soll, eine Gruppe, die alle Hosts enthält, auf die dieses Playbook angewendet werden soll. Ich mag die Idee nicht, anzunehmen, dass Ansible von einem Menschen ausgeführt wird, der weiß, an welchen Host er sich wenden soll, das sollte in einer Datei sein. – sorin

+0

Sorry, vielleicht war ich nicht klar. Ich benutzte eine env-Variable mit dem dynamischen Inventar, in meinem Fall war ein Python-Skript, das die env-Variable las und die Hosts aus der Datenbank darauf (und natürlich die Host-Gruppe) auswählte. Die mehreren Inventare würden verwendet, wenn Sie ein dynamisches Inventar oder ein env var nicht verwenden möchten/können. Ich habe nicht ganz verstanden, was Sie in dem Teil der Standardwerte meinen. – shaps

1

Wenn Sie auf AWS sind, würde ich ein dynamisches Inventar verwenden.

Wir sind nicht auf AWS oder etwas ähnliches. Also ich habe leider keine schicke api mit tag etc.In diesem Fall ist ein Inventar für jede Umgebung die beste Lösung für uns. In diesen Inventaren verwenden wir einfache Hostgruppen. Inventar/prod.ini

[mysql] 
db-server.prod.domain 

[web] 
app-1-server.prod.domain 
app-2-server.prod.domain 

Playbooks organisiert über Gruppen:

Inventardateien werden in einem subfoder gespeichert. So habe ich eine mysql.yml Playbook für alle Datenbank-Sachen und eine web.yml Playbook für den Webserver. Sie sind in einem main.yml Playbook enthalten, um sie für einen vollständigen Lauf in einer bestimmten Reihenfolge zu orchestrieren.

include mysql.yml 
include web.yml 

Dies ist vielleicht nicht die beste oder cleverste Lösung, aber es funktioniert und es ist einfach für alle Teammitglieder zu erklären. Ich mag die Idee von Umgebungsvariablen, aber meiner Meinung nach ist es nicht besser, eine einfache, aber funktionierende Lösung zu haben. Wir verwenden dieses Schema seit einigen Monaten, ohne versehentlich in die falsche Umgebung zu gelangen.

Ich brauche etwas mehr Magie oder einen einfachen Befehl für jede Umgebung, die Sie in Task-Runner wie Ameisen oder etwas ähnliches umhüllen können.