Dies ist eine sehr breite Frage zu Methoden und Ratschlägen in Bezug auf Umgebungsvariablen / -strukturen. Aber letztendlich suche ich nach Antworten auf die sehr spezifische Frage: "Wie soll ich meine Umgebungsvariablen speichern?"
Zunächst einige Klarstellungen:
- Eine Umgebung kann für mich aus 3 bis 10 Servern bestehen und ist eine Möglichkeit, die Infrastruktur eines bestimmten Kunden zu enthalten.
- In jeder Umgebung gibt es einige Variablen, die meist automatisch aus einigen Schlüsseleingaben (Name, Größe usw.) generiert werden.
Derzeit speichern wir alle unsere Umgebungsvariablen in einer Struktur wie der folgenden:
<playbook>.yml # Various playbooks for deployment
roles/windows # Ansible role for Ubuntu
roles/ubuntu # Ansible role for Ubuntu
config/hosts/<name>.yml # Ansible inventory
config/hosts/vars/<name>.json # Environment specific variables
Im Moment wird die Konfiguration als Submodul im obigen Git-Repository initialisiert. Da sich die Variablendatei ziemlich häufig ändert, hat dies zu Problemen mit der Änderung der Daten geführt, die ein-, zweimal oder sogar dreimal zwischen den Festschreibungen liegen, wodurch es immer schwieriger wird, Änderungen nachzuverfolgen.
Wie ich persönlich sehe, sollten wir versuchen , alle unsere Kundenvariablen zentral / skalierbar zu speichern und uns dann mit einem dynamischen Inventar mit Ansible darauf einzulassen .
Ich verstehe, dass es einige Technologien gibt, die einen Teil dessen leisten, was erforderlich sein könnte, wie z. B. Consul, aber sie scheinen am besten in einer Umgebung zu funktionieren, die nur eine große Anwendung bedient, anstatt viele kleinere, leicht unterschiedliche.
Ich sehe im Wesentlichen, dass wir ein Inventarskript schreiben und dann einfach alle unsere Daten in eine nicht speziell erstellte Datenbank schieben müssen und dann so weitermachen müssen, als ob sich nichts geändert hätte. Ich sehe dies möglicherweise als eine Möglichkeit, viele der derzeit gespeicherten Daten möglicherweise zu reduzieren und möglicherweise verschiedene Möglichkeiten zum Speichern der Daten zu untersuchen, anstatt nur zu vergrößern, was sie erneut bereitstellen.
Ich hoffe, jemand hat Erfahrung in der Implementierung von Infrastruktur als Code, wenn er mit vielen kleineren Umgebungen im Gegensatz zu einer, zwei oder drei großen Umgebungen umgehen muss.
Irgendwelche Vorschläge?
Wenn Ihre Umgebungen pro Kunde sind, würde ich in Ihrem speziellen Fall vorschlagen , ein Repository pro Kunde zu haben . (Im Allgemeinen handelt es sich um ein Repository pro Umgebung.) Dieses Repository verfügt über eine Standardverzeichnisstruktur für Umgebungsvariablen, ansible Variablen und Inventare sowie stark verschlüsselte Geheimnisse (Kontozugriffstoken, private Schlüssel usw.). Sie würden den Code in diese Repositorys submodulieren. Ich würde es wahrscheinlich in mehreren Repositories tun. Eine für ansible Rollen und Module, eine für Wartungs- und Bereitstellungsskripte, eine für jede wichtige Anwendung, die in den Umgebungen ausgeführt wird.
Jetzt können Sie den Code optional tatsächlich teilen oder das Submodul auf andere Weise an einem bestimmten Tag für die Freigabe anheften , um sicherzustellen, dass sich der Code, der die Umgebung des Kunden verwaltet, nur ändert, wenn er getestet und freigegeben wird.
Wenn Sie ein Artefakt-Repository verwenden , stellen Sie sicher, dass die Artefakte ordnungsgemäß versioniert sind und diese Versionen in den Umgebungsvariablen ordnungsgemäß angegeben sind.
Die Automatisierung ist wichtig, da die Umgebungsvariablen nach Möglichkeit nicht von Menschen aktualisiert, sondern von Skripten generiert werden sollten. Stellen Sie sicher, dass das Inventar pro Kunde fast keine manuellen Aktualisierungen enthält und die Entwickler nur die Code-Repositorys aktualisieren. Wenn sie Konfigurationsänderungen vornehmen möchten, sollte dies an einem der generierenden Skripte vorgenommen werden, das dann ausgeführt wird, um die Variablen zu generieren, und der Diff wird in das Kunden-Repository übernommen. Es lohnt sich, eine kontinuierliche Integration für diesen Prozess einzurichten. Ohne dies wird es irgendwann zu viele Repositorys geben, um sie zu verwalten .
quelle