Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Es scheint, dass die Terraform-Entwickler recht praktische Best Practices für die Arbeit mit der AWS-Infrastruktur anbieten. Nur gibt es eine Nuance. Mit der Zeit nimmt die Anzahl der Umgebungen zu und in jeder erscheinen Funktionen. Erscheint fast eine Kopie des Anwendungsstapels in der Nachbarregion. Und der Terraform-Code muss sorgfältig kopiert und entsprechend den neuen Anforderungen bearbeitet werden oder eine Schneeflocke erstellen.

In meinem Bericht geht es um Muster in Terraform, um Chaos und manuelle Routine bei großen und langen Projekten zu bekämpfen.

Video:

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Ich bin 40 und seit 20 Jahren in der IT tätig. Ich arbeite seit 12 Jahren bei Ixtens. Wir beschäftigen uns mit der E-Commerce-gesteuerten Entwicklung. Und ich praktiziere seit 5 Jahren DevOps-Praktiken.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

In meiner Geschichte geht es um die Erfahrung bei einem Projekt in einem Unternehmen, dessen Namen ich nicht nennen werde, das sich hinter einer Geheimhaltungsvereinbarung verbirgt.

Die Zahlen auf der Folie dienen dazu, den Umfang des Projekts zu verstehen. Und alles, was ich als nächstes sagen werde, hat mit Amazon zu tun.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Ich bin diesem Projekt vor 4 Jahren beigetreten. Und die Umgestaltung der Infrastruktur war in vollem Gange, denn das Projekt war gewachsen. Und die verwendeten Muster passen nicht mehr. Und angesichts des geplanten Wachstums des Projekts war es notwendig, sich etwas Neues einfallen zu lassen.

Danke an Matvey, der uns gestern erzählt hat, was bei Dodo Pizza passiert ist. Das ist uns vor 4 Jahren passiert.

Entwickler kamen und begannen, Infrastrukturcode zu erstellen.

Der offensichtlichste Grund, warum dies erforderlich war, war die Zeit bis zur Markteinführung. Es musste sichergestellt werden, dass das DevOps-Team beim Rollout keinen Engpass darstellte. Und im allerersten Level kamen unter anderem Terraform und Puppet zum Einsatz.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Terraform ist ein Open-Source-Projekt von HashiCorp. Und für diejenigen, die überhaupt nicht wissen, was es ist, die nächsten Folien.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Infrastruktur als Code bedeutet, dass wir unsere Infrastruktur beschreiben und einige Roboter bitten können, sicherzustellen, dass wir die von uns beschriebenen Ressourcen erhalten.

Wir brauchen zum Beispiel eine virtuelle Maschine. Wir werden einige erforderliche Parameter beschreiben und hinzufügen.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Danach konfigurieren wir den Zugriff auf Amazon in der Konsole. Und fragen Sie nach dem Terraform-Plan. Der Terraform-Plan sagt: „Ok, für Ihre Ressource können wir diese Dinge tun.“ Und es wird mindestens eine Ressource hinzugefügt. Und es sind keine Änderungen zu erwarten.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Wenn alles zu Ihnen passt, können Sie Terraform um eine Bewerbung bitten und Terraform erstellt eine Instanz für Sie und Sie erhalten eine virtuelle Maschine in Ihrer Cloud.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Weiter entwickelt sich unser Projekt. Wir nehmen dort einige Änderungen vor. Wir bitten um weitere Instanzen, wir fügen 53 Einträge hinzu.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Und wir wiederholen es. Bitte planen Sie. Wir schauen, welche Änderungen geplant sind. Anwenden. Und so wächst unsere Infrastruktur.

Terraform verwendet so etwas wie Statusdateien. Das heißt, es speichert alle Änderungen, die an Amazon gehen, in einer Datei, in der für jede von Ihnen beschriebene Ressource entsprechende Ressourcen vorhanden sind, die in Amazon erstellt wurden. Wenn Sie also die Beschreibung einer Ressource ändern, weiß Terraform genau, was in Amazon geändert werden muss.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Diese Statusdateien waren ursprünglich nur Dateien. Und wir haben sie in Git gespeichert, was äußerst unpraktisch war. Ständig vergaß jemand, Änderungen vorzunehmen, und es gab viele Konflikte.

Nun ist es möglich, das Backend zu nutzen, d.h. Terraform gibt an, in welchem ​​Bucket, mit welchem ​​Schlüssel die Statusdatei gespeichert werden soll. Und Terraform selbst wird sich darum kümmern, diese Statusdatei zu erhalten, die ganze Magie auszuführen und das Endergebnis zurückzugeben.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Unsere Infrastruktur wächst. Hier ist unser Code. Und jetzt wollen wir nicht nur eine virtuelle Maschine erstellen, sondern eine Testumgebung haben.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Mit Terraform können Sie so etwas wie ein Modul erstellen, d. h. dasselbe in einem Ordner beschreiben.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Rufen Sie beispielsweise beim Testen dieses Modul auf und erhalten Sie dasselbe, als würden wir Terraform im Modul selbst anwenden. Hier ist der Code zum Testen.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Für die Produktion können wir einige Änderungen dorthin senden, denn beim Testen benötigen wir keine großen Instanzen, in der Produktion sind große Instanzen praktisch.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Und dann gehe ich zurück zum Projekt. Es war eine schwierige Aufgabe, die Infrastruktur war sehr groß geplant. Und es war notwendig, den gesamten Code irgendwie so zu platzieren, dass er für alle bequem ist: für diejenigen, die diesen Code warten, und für diejenigen, die Änderungen vornehmen. Und es war geplant, dass jeder Entwickler die Infrastruktur nach Bedarf für seinen Teil der Plattform reparieren könnte.

Dies ist ein Verzeichnisbaum, der von HashiCorp empfohlen wird, wenn Sie ein großes Projekt haben und es sinnvoll ist, die gesamte Infrastruktur in einige kleine Teile zu unterteilen und jeden Teil in einem separaten Ordner zu beschreiben.

Da Sie über eine umfangreiche Ressourcenbibliothek verfügen, können Sie beim Testen und in der Produktion ungefähr das Gleiche aufrufen.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

In unserem Fall war dies nicht ganz geeignet, da der Teststack für Entwickler oder zum Testen irgendwie einfacher beschafft werden musste. Und ich wollte nicht die Ordner durchgehen und sie in der richtigen Reihenfolge anwenden und befürchten, dass die Basis steigen würde und dann die Instanz, die diese Basis nutzt, steigen würde. Daher wurden alle Tests von einem Ordner aus gestartet. Dort wurden die gleichen Module aufgerufen, aber alles ging in einem Durchlauf durch.

Terraform kümmert sich um alle Abhängigkeiten. Und es erstellt immer Ressourcen in dieser Reihenfolge, sodass Sie beispielsweise von einer frisch erstellten Instanz eine IP-Adresse erhalten und diese IP-Adresse im Route53-Eintrag erhalten können.

Zudem ist die Plattform sehr groß. Und das Betreiben eines Test-Stacks, selbst wenn es nur eine Stunde dauert, selbst wenn es acht Stunden lang ist, ist eine ziemlich teure Angelegenheit.

Und wir haben dieses Geschäft automatisiert. Und der Jenkins-Job ermöglichte die Ausführung des Stacks. Es war notwendig, darin eine Pull-Anfrage mit den Änderungen zu starten, die der Entwickler testen möchte, und alle erforderlichen Optionen, Komponenten und Größen anzugeben. Wenn er Leistungstests wünscht, kann er mehr Instanzen übernehmen. Wenn er nur prüfen muss, ob sich ein Formular öffnet, könnte er beim Mindestlohn beginnen. Und geben Sie auch an, ob ein Cluster benötigt wird oder nicht usw.

Und dann hat Jenkins ein Shell-Skript gepusht, das den Code im Terraform-Ordner leicht verändert hat. Unnötige Dateien entfernt und die erforderlichen Dateien hinzugefügt. Und dann, mit einem Durchlauf von Terraform, stieg der Stapel.

Und dann gab es noch weitere Schritte, auf die ich nicht eingehen möchte.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Da wir zum Testen etwas mehr Optionen benötigten als in der Produktion, mussten wir Kopien der Module erstellen, damit wir in diesen Kopien die Funktionen hinzufügen konnten, die nur zum Testen benötigt wurden.

Und so kam es, dass es beim Testen so aussieht, als ob man die Änderungen testen möchte, die schließlich in die Produktion gehen. Tatsächlich wurde jedoch eines getestet und in der Produktion etwas anderes verwendet. Und es gab einen kleinen Bruch im Muster, dass in der Produktion alle Änderungen vom Betriebsteam übernommen wurden. Und manchmal stellte sich heraus, dass die Änderungen, die vom Testen in die Produktion übergehen sollten, in einer anderen Version verblieben waren.

Darüber hinaus gab es das Problem, dass ein neuer Dienst hinzugefügt wurde, der sich geringfügig von einigen bestehenden unterschied. Und anstatt ein vorhandenes Modul zu ändern, mussten Sie eine Kopie davon erstellen und die erforderlichen Änderungen hinzufügen.

Tatsächlich ist Terraform keine echte Sprache. Dies ist eine Erklärung. Wenn wir etwas deklarieren müssen, dann deklarieren wir es. Und es funktioniert alles.

Irgendwann, als ich einen meiner Pull-Requests besprach, sagte einer meiner Kollegen, dass es nicht notwendig sei, Schneeflocken zu produzieren. Ich fragte mich, was er meinte. Es gibt eine wissenschaftliche Tatsache, dass es auf der Welt keine zwei identischen Schneeflocken gibt, sie sind alle leicht, aber unterschiedlich. Und als ich das hörte, spürte ich sofort das volle Gewicht des Terraform-Codes. Denn als es erforderlich war, von Version zu Version zu wechseln, erforderte Terraform eine Breaking-Chain-Änderung, d. h. der Code war nicht mehr mit der nächsten Version kompatibel. Und ich musste eine Pull-Anfrage stellen, die fast die Hälfte der Dateien in der Infrastruktur abdeckte, um die Infrastruktur auf die nächste Version von Terraform zu bringen.

Und nachdem so eine Schneeflocke aufgetaucht war, verwandelte sich der gesamte Terraform-Code, den wir hatten, in einen großen, großen Schneehaufen.

Für einen externen Entwickler, der außerhalb des Betriebs ist, macht es ihm nicht viel aus, denn er hat eine Pull-Anfrage gestellt, seine Ressource gestartet. Und das ist es, es geht ihn nichts an. Und das DevOps-Team, das dafür sorgt, dass alles in Ordnung ist, muss all diese Änderungen vornehmen. Und die Kosten dieser Veränderungen stiegen mit jeder weiteren Schneeflocke sehr, sehr stark an.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Es gibt eine Geschichte darüber, wie ein Student in einem Seminar mit Kreide zwei perfekte Kreise auf eine Tafel zeichnet. Und der Lehrer ist überrascht, wie er es geschafft hat, ohne Zirkel so reibungslos zu zeichnen. Der Student antwortet: „Es ist ganz einfach, ich habe zwei Jahre lang in der Armee einen Fleischwolf gedreht.“

Und von den vier Jahren, die ich an diesem Projekt arbeite, arbeite ich seit etwa zwei Jahren an Terraform. Und natürlich habe ich einige Tricks und Tipps, wie man den Terraform-Code vereinfacht, damit wie eine Programmiersprache arbeitet und die Belastung für Entwickler verringert, die diesen Code auf dem neuesten Stand halten müssen.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Das erste, womit ich beginnen möchte, sind Symlinks. Terraform hat viel sich wiederholenden Code. Beispielsweise ist es an fast jedem Punkt, an dem wir eine Infrastruktur erstellen, gleich, einen Anbieter anzurufen. Und es ist logisch, es in einem separaten Daddy unterzubringen. Und überall dort, wo der Anbieter verpflichtet ist, Symlinks zu dieser Datei zu erstellen.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Beispielsweise verwenden Sie die Funktion „Rolle übernehmen“ in der Produktion, um Zugriffsrechte für ein externes Amazon-Konto zu erhalten. Und durch die Änderung einer Datei erhalten alle verbleibenden Dateien im Ressourcenbaum die erforderlichen Rechte, sodass Terraform weiß, auf welches Amazon-Segment zugegriffen werden muss.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Wo funktionieren Symlinks nicht? Wie gesagt, Terraform verfügt über Statusdateien. Und sie sind sehr, sehr cool. Tatsache ist jedoch, dass Terraform das Backend im allerersten Fall initialisiert. Und er kann in diesen Parametern keine Variablen verwenden, sie müssen immer in Text geschrieben werden.

Wenn jemand eine neue Ressource erstellt, kopiert er daher einen Teil des Codes aus anderen Ordnern. Und er kann mit dem Schlüssel oder mit dem Eimer einen Fehler machen. Zum Beispiel baut er aus einem Sandkasten ein Sandkasten-Ding und stellt es dann in der Produktion her. Und so kann es sein, dass der Eimer in der Produktion aus dem Sandkasten verwendet wird. Natürlich werden sie es schnell finden. Es wird möglich sein, das irgendwie zu beheben, aber es ist dennoch Zeit- und in gewissem Maße auch Ressourcenverschwendung.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Was können wir als nächstes tun? Bevor Sie mit Terraform arbeiten, müssen Sie es initialisieren. Zum Zeitpunkt der Initialisierung lädt Terraform alle Plugins herunter. Irgendwann haben sie sich von einem Monolithen zu einer Mikroservice-Architektur entwickelt. Und Sie müssen immer Terraform init ausführen, damit alle Module und Plugins aufgerufen werden.

Und Sie können ein Shell-Skript verwenden, das zunächst alle Variablen abrufen kann. Shell-Skript ist unbegrenzt. Und zweitens der Weg. Wenn wir als Schlüssel zur Statusdatei immer den Pfad verwenden, der im Repository liegt, dann wird der Fehler hier entsprechend ausgeschlossen.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Wo bekomme ich Daten? JSON-Datei. Mit Terraform können Sie Infrastruktur nicht nur in hcl (HashiCorp Configuration Language), sondern auch in JSON schreiben.

JSON lässt sich leicht über ein Shell-Skript lesen. Dementsprechend können Sie eine Konfigurationsdatei mit einem Bucket an einer beliebigen Stelle ablegen. Und verwenden Sie diesen Bucket sowohl im Terraform-Code als auch im Shell-Skript zur Initialisierung.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Warum ist es wichtig, einen Terraform-Bucket zu haben? Denn es gibt so etwas wie Remote-State-Dateien. Das heißt, wenn ich eine Ressource erhebe, muss ich viele erforderliche Parameter angeben, um Amazon mitzuteilen: „Bitte erhöhen Sie die Instanz“.

Und diese Kennungen werden in einem anderen Ordner gespeichert. Und ich kann es nehmen und sagen: „Terraform, bitte gehen Sie zur Statusdatei dieser Ressource und besorgen Sie mir diese Kennungen.“ Und so gibt es eine Art Vereinigung zwischen verschiedenen Regionen oder Umgebungen.

Es ist nicht immer möglich, eine Remote-Statusdatei zu verwenden. Sie haben beispielsweise manuell eine VPC erstellt. Und der Terraform-Code, der die VPC erstellt, erstellt eine so unterschiedliche VPC, dass es sehr lange dauert und man das eine an das andere anpassen muss, daher kann man den folgenden Trick anwenden.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Das heißt, ein Modul zu erstellen, das sozusagen VPC erstellt und Ihnen Kennungen gibt. Tatsächlich gibt es jedoch nur eine Datei mit fest codierten Werten, die zum Erstellen derselben Instanz verwendet werden kann.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Es ist nicht immer notwendig, die Statusdatei in der Cloud zu speichern. Wenn Sie beispielsweise Module testen, können Sie die Backend-Initialisierung verwenden, bei der die Datei zum Zeitpunkt des Tests nur auf der Festplatte gespeichert wird.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Nun ein wenig zum Testen. Was kann in Terraform getestet werden? Wahrscheinlich ist vieles möglich, aber ich werde über diese 4 Dinge sprechen.

HashiCorp hat ein Verständnis für die Formatierung von Terraform-Code. Und mit Terraform fmt können Sie den von Ihnen bearbeiteten Code entsprechend dieser Überzeugung formatieren. Dementsprechend muss bei den Tests unbedingt überprüft werden, ob die Formatierung mit dem übereinstimmt, was HashiCorp hinterlassen hat, sodass Sie die Position von Klammern usw. nicht ändern müssen.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Der nächste Schritt ist die Terraform-Validierung. Es macht etwas mehr als nur eine Syntaxprüfung – leider sind alle Klammern gepaart. Was ist hier wichtig? Wir haben eine sehr dünne Infrastruktur. Es gibt viele verschiedene Ordner. Und in jedem Fall müssen Sie die Terraform-Validierung ausführen.

Um das Testen zu beschleunigen, führen wir dementsprechend mehrere Prozesse parallel aus.

Parallel ist eine sehr coole Sache, nutzen Sie sie.

Aber jedes Mal, wenn Terraform initialisiert wird, geht es zu HashiCorp und fragt: „Was sind die neuesten Plugins?“ Und das Plugin, das ich im Cache habe – ist es das Richtige oder nicht? Und es wurde mit jedem Schritt langsamer.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Wenn Terraform Ihnen sagt, wo sich die Plugins befinden, sagt Terraform: „OK, das ist wahrscheinlich das Neueste, was es gibt.“ Ich werde nirgendwo hingehen, ich werde sofort mit der Validierung Ihres Terraform-Codes beginnen.“

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Um den Ordner mit den nötigen Plugins zu füllen, haben wir einen sehr einfachen Terraform-Code, der nur initialisiert werden muss. Hier müssen Sie natürlich alle Anbieter angeben, die irgendwie an Ihrem Code beteiligt sind, sonst sagt Terraform: „Ich kenne keinen Anbieter, weil er nicht im Cache ist.“

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Der nächste ist der Terraform-Plan. Wie gesagt, die Entwicklung ist zyklisch. Wir erstellen Code mit Änderungen. Und dann gilt es herauszufinden, welche Änderungen an der Infrastruktur geplant sind.

Und wenn die Infrastruktur sehr, sehr groß ist, können Sie ein Modul ändern, eine Testumgebung oder eine bestimmte Region reparieren und ein benachbartes Modul zerstören. Daher sollte ein Terraform-Plan für die gesamte Infrastruktur erstellt werden und aufzeigen, welche Änderungen geplant sind.

Sie können es auf die intelligente Art und Weise tun. Wir haben beispielsweise ein Python-Skript geschrieben, das Abhängigkeiten auflöst. Und je nachdem, was geändert wurde: ein Terraform-Modul oder nur eine bestimmte Komponente, erstellt es Pläne für alle abhängigen Ordner.

Der Terraform-Plan muss auf Anfrage erstellt werden. Zumindest machen wir das.

Natürlich ist es gut, Tests für jede Änderung und jeden Commit durchzuführen, aber Pläne sind eine ziemlich teure Sache. Und wir sagen im Pull-Request: „Bitte gib mir die Pläne.“ Der Roboter startet. Und sendet an die Kommentare oder zum Anhängen alle Pläne, die von Ihren Änderungen erwartet werden.

Der Plan ist eine ziemlich teure Sache. Es braucht Zeit, denn Terraform geht zu Amazon und fragt: „Existiert diese Instanz noch?“ Hat diese Autoskalierung genau die gleichen Parameter?“ Und um es zu beschleunigen, können Sie einen Parameter wie „refresh=false“ verwenden. Dies bedeutet, dass Terraform den S3-Status entleert. Und ich werde glauben, dass der Staat genau dem entspricht, was bei Amazon steht.

Ein solcher Terraform-Plan ist viel schneller, aber der Zustand muss mit Ihrer Infrastruktur übereinstimmen, d. h. irgendwo, irgendwann muss die Terraform-Aktualisierung beginnen. Terraform Refresh tut genau das, sodass der Zustand mit dem in der realen Infrastruktur übereinstimmt.

Und ich muss etwas zur Sicherheit sagen. Hier hätte es beginnen sollen. Wenn Sie Terraform ausführen und Terraform mit Ihrer Infrastruktur funktioniert, besteht eine Sicherheitslücke. Das heißt, Sie führen im Wesentlichen Code aus. Und wenn der Pull-Request irgendeine Art von Schadcode enthält, kann er auf einer Infrastruktur ausgeführt werden, die zu viel Zugriff hat. Seien Sie daher vorsichtig, wo Sie den Terraform-Plan starten.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Das nächste, worüber ich sprechen möchte, ist das Testen von Benutzerdaten.

Was sind Benutzerdaten? Wenn wir in Amazon eine Instanz erstellen, können wir eine Art Brief von der Instanz senden – Metadaten. Wenn eine Instanz gestartet wird, ist Cloud Init normalerweise immer auf diesen Instanzen vorhanden. Cloud Init liest diesen Brief und sagt: „OK, heute bin ich Load Balancer.“ Und in Übereinstimmung mit diesen Vorschriften führt er einige Handlungen aus.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Aber wenn wir Terraform planen und Terraform anwenden, sehen die Benutzerdaten leider wie dieser Zahlenschlamm aus. Das heißt, er sendet Ihnen einfach einen Hash. Und alles, was Sie im Plan sehen können, ist, ob es Änderungen gibt oder der Hash gleich bleibt.

Und wenn Sie dies nicht beachten, kann es sein, dass eine abgenutzte Textdatei an Amazon, an die eigentliche Infrastruktur, gelangt.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Alternativ können Sie bei der Ausführung nicht die gesamte Infrastruktur angeben, sondern nur das Template. Und sagen Sie im Code: „Bitte zeigen Sie mir diese Vorlage an.“ Und als Ergebnis erhalten Sie einen Ausdruck, wie Ihre Daten bei Amazon aussehen werden.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Eine andere Möglichkeit besteht darin, ein Modul zur Generierung von Benutzerdaten zu verwenden. Sie wenden dieses Modul an. Holen Sie sich die Datei auf die Festplatte. Vergleichen Sie es mit der Referenz. Und wenn also irgendein Jun beschließt, ein paar Benutzerdaten zu korrigieren, dann werden Ihre Tests sagen: „Okay, es gibt hier und da einige Änderungen – das ist normal.“

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Das nächste, worüber ich sprechen möchte, ist die Anwendung von Automate Terraform.

Natürlich ist es beängstigend genug, Terraform im automatischen Modus anzuwenden, denn wer weiß, welche Änderungen es dort gegeben hat und wie schädlich sie für eine lebendige Infrastruktur sein können.

Für eine Testumgebung ist das alles in Ordnung. Das heißt, ein Job, der eine Testumgebung erstellt, ist das, was alle Entwickler brauchen. Und ein Ausdruck wie „Bei mir hat alles funktioniert“ ist kein lustiges Meme, sondern ein Beweis dafür, dass eine Person verwirrt war, einen Stapel angehoben und einige Tests auf diesem Stapel gestartet hat. Und er stellte sicher, dass dort alles in Ordnung war und sagte: „OK, der Code, den ich veröffentliche, wurde getestet.“

In Produktions-, Sandbox- und anderen geschäftskritischeren Umgebungen ist es sicher, einige Ressourcen teilweise zu nutzen, da dadurch niemand stirbt. Dies sind: Autoskalierungsgruppen, Sicherheitsgruppen, Rollen, Route53 und da kann die Liste recht umfangreich sein. Aber behalten Sie das Geschehen im Auge und lesen Sie Berichte über automatisierte Anwendungen.

Wenn die Verwendung gefährlich oder beängstigend ist, beispielsweise wenn es sich um persistente Ressourcen aus einer Datenbank handelt, erhalten Sie Berichte darüber, dass es in einem Teil der Infrastruktur nicht angewendete Änderungen gibt. Und der Techniker wird bereits von seiner Konsole aus beaufsichtigt, indem er die anzuwendenden Aufträge ausführt.

Amazon verfügt über einen Kündigungsschutz. Und es kann in manchen Fällen vor Änderungen schützen, die für Sie nicht erforderlich sind. Also ging Terraform zu Amazon und sagte: „Ich muss diese Instanz beenden, um eine neue zu erstellen.“ Und Amazon sagt: „Tut mir leid, heute nicht.“ Wir haben Terminate-Schutz.“

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Und das Tüpfelchen auf dem i ist die Codeoptimierung. Wenn wir mit Terraform-Code arbeiten, müssen wir eine sehr große Anzahl von Parametern an das Modul übergeben. Dies sind die Parameter, die notwendig sind, um eine Art Ressource zu erstellen. Und der Code verwandelt sich in große Listen von Parametern, die von Modul zu Modul, von Modul zu Modul weitergegeben werden müssen, insbesondere wenn die Module verschachtelt sind.

Und es ist sehr schwer zu lesen. Es ist sehr schwierig, dies zu überprüfen. Und sehr oft stellt sich heraus, dass einige Parameter überprüft werden, aber nicht ganz die sind, die benötigt werden. Und es kostet Zeit und Geld, das Problem später zu beheben.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Daher schlage ich vor, dass Sie so etwas wie einen komplexen Parameter verwenden, der einen bestimmten Wertebaum enthält. Das heißt, Sie benötigen einen Ordner, in dem Sie alle Werte haben, die Sie in einer bestimmten Umgebung haben möchten.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Und indem Sie dieses Modul aufrufen, können Sie einen Baum erhalten, der in einem gemeinsamen Modul generiert wird, also in einem gemeinsamen Modul, das für die gesamte Infrastruktur gleich funktioniert.

In diesem Modul können Sie einige Berechnungen mit einer so neuen Funktion in Terraform wie Locals durchführen. Geben Sie dann in einer Ausgabe einen komplexen Parameter aus, der Hashes, Arrays usw. umfassen kann.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Hiermit die besten Funde, die ich gemacht habe. Und ich möchte eine Geschichte über Kolumbus erzählen. Als er Geld für seine Expedition zur Entdeckung Indiens suchte (wie er damals dachte), glaubte ihm niemand und glaubte, dass es unmöglich sei. Dann sagte er: „Pass auf, dass das Ei nicht herunterfällt.“ Alle Bankiers, sehr reiche und wahrscheinlich kluge Leute, versuchten, das Ei auf irgendeine Weise zu platzieren, und es fiel ständig. Dann nahm Kolumbus das Ei und drückte es ein wenig. Die Schale zerknitterte und das Ei blieb bewegungslos. Sie sagten: „Oh, das ist zu einfach!“ Und Kolumbus antwortete: „Ja, es ist zu einfach. Und wenn ich Indien öffne, wird jeder diesen Handelsweg nutzen.“

Und was ich Ihnen gerade erzählt habe, sind wahrscheinlich ganz einfache und triviale Dinge. Und wenn man davon erfährt und anfängt, sie zu nutzen, ist das in der Reihenfolge der Dinge. Also nutzen Sie es. Und wenn das für Sie ganz normale Dinge sind, dann wissen Sie zumindest, wie man ein Ei so hinlegt, dass es nicht herunterfällt.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Fassen wir zusammen:

  • Vermeiden Sie Schneeflocken. Und je weniger Schneeflocken, desto weniger Ressourcen benötigen Sie, um Änderungen an Ihrer gesamten großen Infrastruktur vorzunehmen.
  • Stetiger Wandel. Das heißt, wenn einige Änderungen im Code aufgetreten sind, müssen Sie Ihre Infrastruktur so schnell wie möglich an diese Änderungen anpassen. Es sollte nicht vorkommen, dass jemand in zwei oder drei Monaten kommt, um sich Elasticsearch anzuschauen, einen Terraform-Plan macht und es viele Änderungen gibt, mit denen er nicht gerechnet hat. Und es braucht viel Zeit, alles wieder in Ordnung zu bringen.
  • Tests und Automatisierung. Je mehr Code Sie mit Tests und Funktionen abgedeckt haben, desto mehr Vertrauen haben Sie, dass Sie alles richtig machen. Und die automatische Zustellung steigert Ihr Vertrauen um ein Vielfaches.
  • Der Code für die Test- und Produktionsumgebung sollte nahezu identisch sein. Praktisch, denn schließlich ist die Produktion etwas anders und es wird noch einige Nuancen geben, die über die Testumgebung hinausgehen. Aber dennoch kann ein Plus oder Minus bereitgestellt werden.
  • Und wenn Sie viel Terraform-Code haben und es viel Zeit kostet, diesen Code auf dem neuesten Stand zu halten, dann ist es nie zu spät, ihn umzugestalten und in einen guten Zustand zu bringen.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

  • unveränderliche Infrastruktur. AMI-Lieferung pünktlich.
  • Struktur für Route53, wenn Sie viele Einträge haben und diese in einer konsistenten Reihenfolge haben möchten.
  • Kämpfen Sie gegen API-Ratenbeschränkungen. Dann sagt Amazon: „Das war's, ich kann keine Anfragen mehr annehmen, bitte warten.“ Und die Hälfte des Büros wartet darauf, dass es seine Infrastruktur starten kann.
  • Spot-Instanzen. Amazon ist keine billige Veranstaltung und bei Spots können Sie viel sparen. Und da kann man einen ganzen Bericht darüber erzählen.
  • Sicherheits- und IAM-Rollen.
  • Suchen Sie nach verlorenen Ressourcen. Wenn Sie in Amazone Instanzen unbekannter Herkunft haben, verschlingen diese Geld. Selbst wenn Instanzen 100–150 US-Dollar pro Monat kosten, sind es mehr als 1 US-Dollar pro Jahr. Die Suche nach solchen Ressourcen ist ein lukratives Geschäft.
  • Und reservierte Instanzen.

Muster in Terraform zur Bekämpfung von Chaos und manueller Routine. Maxim Kostrikin (Ixtens)

Das ist alles für mich. Terraform ist sehr cool, nutzen Sie es. Danke!

Fragen

Danke für den Bericht! Sie haben eine Statusdatei in S3, aber wie lösen Sie das Problem, dass mehrere Personen diese Statusdatei nehmen und versuchen können, sie bereitzustellen?

Erstens haben wir es nicht eilig. Zweitens gibt es Flags, in denen wir melden, dass wir an einem Code arbeiten. Das heißt, obwohl die Infrastruktur sehr groß ist, bedeutet dies nicht, dass jemand ständig etwas nutzt. Und wenn es eine aktive Phase gab, war das ein Problem, wir haben die Statusdateien in Git gespeichert. Das war wichtig, sonst würde jemand eine Statusdatei erstellen und wir müssten sie manuell auf einem Haufen sammeln, um weitermachen zu können. Jetzt gibt es kein solches Problem. Im Allgemeinen hat Terraform dieses Problem gelöst. Und wenn sich ständig etwas ändert, können Sie Sperren verwenden, die das Gesagte verhindern.

Nutzen Sie Open Source oder Enterprise?

Kein Unternehmen, das heißt, alles, was Sie kostenlos herunterladen können.

Mein Name ist Stanislav. Ich wollte eine kleine Ergänzung machen. Sie haben über die Amazon-Funktion gesprochen, mit der Sie eine Instanz unzerstörbar machen können. Dies ist auch in Terraform selbst der Fall, im Life Second-Block kann man ein Verbot der Veränderung oder ein Verbot der Zerstörung vorschreiben.

War zeitlich begrenzt. Guter Punkt.

Ich wollte auch zwei Dinge fragen. Zuerst haben Sie über das Testen gesprochen. Haben Sie Testtools verwendet? Ich habe vom Test Kitchen-Plugin gehört. Vielleicht gibt es noch etwas anderes. Und ich würde gerne nach lokalen Werten fragen. Wie unterscheiden sie sich grundsätzlich von Eingabevariablen? Und warum kann ich etwas nicht nur über lokale Werte parametrisieren? Ich habe versucht, mich mit diesem Thema auseinanderzusetzen, aber irgendwie habe ich es selbst nicht herausgefunden.

Hinter dieser Halle können wir ausführlicher sprechen. Prüfwerkzeuge sind unsere komplette Eigenfertigung. Da gibt es nichts zu testen. Im Allgemeinen gibt es Optionen, bei denen automatische Tests die Infrastruktur irgendwo hochfahren, überprüfen, ob sie in Ordnung ist, und dann alles zerstören, indem sie melden, dass Ihre Infrastruktur noch in gutem Zustand ist. Das gibt es bei uns nicht, da die Teststacks jeden Tag laufen. Und das reicht. Und wenn etwas kaputt geht, dann wird es kaputt gehen, ohne dass wir es woanders überprüfen.

Lassen Sie uns das Gespräch über lokale Werte außerhalb des Publikums fortsetzen.

Hallo! Danke für den Bericht! Sehr informativ. Sie sagten, dass Sie viele Codes derselben Art haben, um die Infrastruktur zu beschreiben. Haben Sie darüber nachgedacht, diesen Code zu generieren?

Tolle Frage, danke! Der Punkt ist, dass wir, wenn wir Infrastruktur als Code verwenden, davon ausgehen, dass wir uns den Code ansehen und verstehen, welche Art von Infrastruktur sich hinter diesem Code verbirgt. Wenn der Code generiert wird, müssen wir uns vorstellen, welcher Code generiert wird, um zu verstehen, welche Art von Infrastruktur dort vorhanden sein wird. Oder wir generieren den Code, schreiben ihn fest und erhalten tatsächlich dasselbe. Deshalb sind wir den Weg gegangen, den wir geschrieben haben, wir haben es verstanden. Außerdem erschienen Generatoren etwas später, als wir mit der Herstellung begannen. Und es war zu spät, um etwas zu ändern.

Haben Sie schon von Jsonnet gehört?

Nein.

Schauen Sie, das ist wirklich cooles Zeug. Ich sehe einen speziellen Fall, in dem Sie es anwenden und eine Datenstruktur generieren können.

Generatoren sind gut, wenn man sie hat, wie im Witz über den Rasierapparat. Das heißt, beim ersten Mal ist das Gesicht anders, aber dann haben alle das gleiche Gesicht. Die Generatoren sind sehr cool. Aber leider sind unsere Gesichter ein wenig anders. Das ist ein Problem.

Schau einfach. Danke!

Mein Name ist Maxim, ich komme von der Sberbank. Sie haben kurz gesagt, dass Sie versucht haben, Terraform zu einem Analogon einer Programmiersprache zu machen. Ist es nicht einfacher, Ansible zu verwenden?

Das sind sehr unterschiedliche Dinge. Ansible kann Ressourcen erstellen und Puppet kann Ressourcen in Amazon erstellen. Aber Terraform ist geradezu geschärft.

Hast du nur Amazon?

Es ist nicht so, dass wir nur Amazon haben. Wir haben fast nur Amazon. Aber das Hauptmerkmal ist, dass Terraform sich erinnert. Wenn Sie in Ansible sagen: „Nimm mir 5 Instanzen“, dann wird es erhöht, und dann sagst du: „Und jetzt brauche ich 3“. Und Terraform wird sagen: „Ok, ich werde 2 töten“, und Ansible wird sagen: „Ok, hier sind 3 für Sie.“ Insgesamt 8.

Guten Tag! Danke für deinen Bericht! Es war sehr interessant, von Terraform zu hören. Ich möchte nur eine kleine Bemerkung dazu machen, dass es für Terraform immer noch keine stabile Version gibt. Seien Sie also sehr vorsichtig mit Terraform.

Schöner Löffel zum Abendessen. Das heißt, wenn Sie eine Lösung benötigen, verschieben Sie manchmal, was instabil ist usw., aber es funktioniert und hat uns geholfen.

Die Frage ist. Sie verwenden das Remote-Backend, Sie verwenden S 3. Warum verwenden Sie nicht das offizielle Backend?

Offiziell?

Terraform-Cloud.

Wann erschien er?

Vor ungefähr 4 Monaten.

Wenn es vor 4 Jahren erschienen wäre, hätte ich Ihre Frage wahrscheinlich beantwortet.

Es gibt bereits eine integrierte Funktion und Sperren, und Sie können eine Statusdatei speichern. Versuch es. Aber ich habe es auch nicht getestet.

Wir sitzen in einem großen Zug, der mit hoher Geschwindigkeit fährt. Und man kann nicht einfach ein paar Autos nehmen und wegwerfen.

Du hast von Schneeflocken gesprochen, warum hast du nicht branch verwendet? Warum hat es nicht so geklappt?

Wir verfolgen einen solchen Ansatz, dass sich die gesamte Infrastruktur in einem Repository befindet. Terraform, Puppet, alle Skripte, die irgendwie damit zu tun haben, sind alle in einem Repository. Auf diese Weise können wir sicherstellen, dass inkrementelle Änderungen einzeln getestet werden. Wenn es sich um eine Ansammlung von Zweigen handeln würde, wäre ein solches Projekt nahezu unmöglich aufrechtzuerhalten. Sechs Monate vergehen und sie weichen so sehr voneinander ab, dass es nur eine Art Strafe ist. Das ist es, wovor ich vor dem Refactoring davonlaufen wollte.

d.h. es funktioniert nicht?

Es funktioniert überhaupt nicht.

Im Zweig habe ich die Ordnerfolie ausgeschnitten. Das heißt, wenn Sie beispielsweise für jeden Teststapel festlegen, dass Team A seinen eigenen Papa hat und Team B seinen eigenen Papa, dann funktioniert das auch nicht. Wir haben einen einheitlichen Testumgebungscode erstellt, der flexibel genug ist, um für jeden geeignet zu sein. Das heißt, wir haben einen Code bereitgestellt.

Hallo! Mein Name ist Yura! Danke für den Bericht! Frage zu Modulen. Sie sagen, Sie verwenden Module. Wie lösen Sie das Problem, wenn in einem Modul Änderungen vorgenommen wurden, die nicht mit der Änderung einer anderen Person kompatibel sind? Irgendwie Module versionieren oder versuchen, ein Wunderkind dazu zu bringen, zwei Anforderungen zu erfüllen?

Das ist das große Schneehaufenproblem. Darunter leiden wir, wenn eine harmlose Änderung einen Teil der Infrastruktur zerstören kann. Und es wird sich erst nach einiger Zeit bemerkbar machen.

Das heißt, es ist noch nicht entschieden?

Sie stellen universelle Module her. Vermeiden Sie Schneeflocken. Und alles wird gut. In der zweiten Hälfte des Berichts geht es darum, wie man dies vermeiden kann.

Guten Tag! Danke für den Bericht! Ich möchte klarstellen. Hinter den Kulissen lag ein großer Haufen, für den ich gekommen bin. Wie werden Puppet und Rollenverteilung integriert?

Benutzerdaten.

Das heißt, spucken Sie die Datei einfach aus und führen sie irgendwie aus?

Benutzerdaten sind eine Notiz, d. h. wenn wir einen Image-Klon erstellen, steigt Daemon auf und versucht herauszufinden, wer er ist, liest eine Notiz, dass er ein Load Balancer ist.

Das heißt, handelt es sich um eine Art separaten Prozess, der verschenkt wird?

Wir haben es nicht erfunden. Wir nutzen es.

Guten Tag! Ich habe nur eine Frage zu Benutzerdaten. Sie sagten, dass es dort Probleme gäbe, dass jemand etwas an die falsche Stelle schicken könnte. Gibt es eine Möglichkeit, Benutzerdaten im selben Git zu speichern, sodass immer klar ist, worauf sich Benutzerdaten beziehen?

Wir generieren Benutzerdaten aus einer Vorlage. Das heißt, eine bestimmte Anzahl von Variablen greift dorthin. Und Terraform generiert das Endergebnis. Daher können Sie nicht einfach auf die Vorlage schauen und sagen, was passiert, denn alle Probleme hängen damit zusammen, dass der Entwickler denkt, dass er einen String in dieser Variablen übergibt und dann ein Array verwendet. Und er – zack und ich – so und so, so und so, die nächste Zeile, und alles ging kaputt. Wenn es sich um eine neue Ressource handelt und eine Person darauf hinweist, dass etwas nicht funktioniert, wird das Problem schnell gelöst. Und wenn diese Autoskalierungsgruppe aktualisiert wurde, beginnen irgendwann die Instanzen in der Autoskalierungsgruppe ersetzt zu werden. Und klatschen, irgendetwas funktioniert nicht. Es schmerzt.

Es stellt sich heraus, dass die einzige Lösung darin besteht, zu testen?

Ja, Sie sehen das Problem, Sie fügen dort Testschritte hinzu. Das heißt, die Ausgabe kann auch getestet werden. Vielleicht nicht so praktisch, aber Sie können auch ein paar Markierungen setzen – überprüfen Sie, ob hier Benutzerdaten angezeigt werden.

Mein Name ist Timur. Es ist sehr cool, dass es Berichte darüber gibt, wie man Terraform richtig organisiert.

Ich habe noch nicht einmal angefangen.

Ich denke, dass es bei der nächsten Konferenz vielleicht so sein wird. Ich habe eine einfache Frage. Warum codieren Sie den Wert in einem separaten Modul fest, anstatt tfvars zu verwenden, d. h. ist ein Modul mit Werten besser als tfvars?

Das heißt, ich sollte hier schreiben (Folie: Production/environment/settings.tf): domain = variable, domain vpcnetwork, vpcnetwork variable und stvars – erhalten Sie das Gleiche?

Wir machen genau das. Wir beziehen uns beispielsweise auf das Einstellungsquellenmodul.

Tatsächlich ist dies so ein Tfvars. Tfvars ist in einer Testumgebung sehr praktisch. Ich habe Tfvars für große Instanzen, für kleine. Und ich habe eine Datei in den Ordner geworfen. Und bekam, was ich wollte. Wenn wir Infrastruktur sehen, wollen wir alles sehen und sofort verstehen können. Es stellt sich also heraus, dass Sie hier und dann in tfvars suchen müssen.

Es stellte sich heraus, dass alles an einem Ort war?

Ja, tfvars ist, wenn Sie einen Code haben. Und es wird an verschiedenen Orten mit unterschiedlichen Nuancen verwendet. Dann würden Sie Tfvars werfen und Ihre Nuancen erhalten. Und wir sind Infrastruktur als Code in seiner reinsten Form. Geschaut und verstanden.

Guten Tag! Haben Sie Situationen erlebt, in denen der Cloud-Anbieter Ihre Arbeit mit Terraform beeinträchtigt? Nehmen wir an, wir bearbeiten die Metadaten. Es gibt SSH-Schlüssel. Und Google schiebt ständig seine Metadaten, seine Schlüssel dorthin. Und Terraform schreibt immer, dass es Änderungen gibt. Nach jedem Durchlauf, auch wenn sich nichts ändert, sagt er immer, dass er dieses Feld jetzt aktualisieren wird.

Mit Schlüsseln, aber – ja, ein Teil der Infrastruktur ist von so etwas betroffen, d.h. Terraform kann nichts ändern. Auch mit unseren Händen können wir nichts verändern. Solange wir damit leben.

Das heißt, Sie sind darauf gestoßen, haben sich aber nichts ausgedacht. Wie macht er das und macht es selbst?

Leider ja.

Guten Tag! Mein Name ist Stanislav Starkov. Post. de Gruppe. Wie löst man das Problem mit der Generierung eines Tags auf ..., wie übergibt man es nach innen? Wie ich es verstehe, kann Puppet durch Benutzerdaten den Hostnamen angeben? Und der zweite Teil der Frage. Wie löst man dieses Problem in SG, d. h. wenn man in SG hundert Instanzen desselben Typs generiert, wie benennt man sie dann richtig?

Die für uns sehr wichtigen Ereignisse werden wir schön benennen. Für diejenigen, die nicht benötigt werden, gibt es einen Nachtrag, dass es sich um eine Autoskalierungsgruppe handelt. Und theoretisch kann es genagelt werden und man bekommt ein neues.

Was das Problem mit dem Tag betrifft, so gibt es kein solches Problem, aber es gibt eine solche Aufgabe. Und wir verwenden Tags sehr, sehr häufig, weil die Infrastruktur groß und teuer ist. Und wir müssen uns ansehen, wofür Geld ausgegeben wird, damit wir mithilfe von Tags herausfinden können, was und wohin es geflossen ist. Und dementsprechend kostet die Suche hier viel Geld.

Worum ging es in der Frage noch?

Wenn SG hundert Instanzen erstellt, müssen diese dann irgendwie unterschieden werden?

Nein, nicht. Jede Instanz verfügt über einen Agenten, der mir mitteilt, dass ich ein Problem habe. Meldet sich der Agent, weiß der Agent von ihm und zumindest ist seine IP-Adresse vorhanden. Sie können bereits laufen. Zweitens verwenden wir Consul für Discovery, wo es kein Kubernetes gibt. Und Consul zeigt auch die IP-Adresse der Instanz an.

Das heißt, Sie zielen genau auf die IP und nicht auf den Hostnamen?

Es ist unmöglich, nach Hostnamen zu navigieren, d. h. es gibt viele davon. Es gibt Instanzkennungen – AE usw. Sie können sie irgendwo finden und in die Suche einwerfen.

Hallo! Mir wurde klar, dass Terraform eine gute Sache ist, zugeschnitten auf die Clouds.

Nicht nur.

Das ist die Frage, die mich interessiert. Wenn Sie sich entscheiden, beispielsweise alle Ihre Instanzen massenhaft auf Bare Metal umzustellen? Wird es Probleme geben? Oder muss man trotzdem auf andere Produkte zurückgreifen, zum Beispiel auf das gleiche Ansible, das hier erwähnt wurde?

Bei Ansible geht es ein bisschen um etwas anderes. Das heißt, Ansible wird bereits ausgeführt, wenn die Instanz gestartet wird. Und Terraform funktioniert, bevor die Instanz gestartet ist. Ein Wechsel zu Bare Metal ist nicht möglich.

Nicht jetzt, aber das Geschäft wird kommen und sagen: „Komm schon.“

Zu einer anderen Cloud wechseln – ja, aber hier gibt es eine etwas andere Funktion. Sie müssen Terraform-Code so schreiben, dass Sie mit weniger Blutvergießen zu einer anderen Cloud wechseln können.

Ursprünglich bestand die Aufgabe darin, dass unsere gesamte Infrastruktur agnostisch ist, d. h. jede Cloud sollte in Ordnung sein, aber irgendwann gab das Unternehmen auf und sagte: „OK, in den nächsten N Jahren werden wir nirgendwo hingehen, Sie können Dienste von nutzen.“ Amazon".

Mit Terraform können Sie Front-End-Jobs erstellen, PagerDuty, Datendokumente usw. konfigurieren. Es hat viele Enden. Er kann praktisch die ganze Welt kontrollieren.

Danke für den Bericht! Ich spinne Terraform jetzt auch seit 4 Jahren. In der Phase eines reibungslosen Übergangs zu Terraform, zur Infrastruktur, zu einer deklarativen Beschreibung waren wir mit einer Situation konfrontiert, in der jemand etwas von Hand erledigte und man versuchte, einen Plan zu erstellen. Und da ist mir ein Fehler aufgefallen. Wie gehen Sie mit solchen Problemen um? Wie finden Sie die angezeigten verlorenen Ressourcen?

Meistens mit unseren Händen und Augen: Wenn wir in dem Bericht etwas Seltsames sehen, analysieren wir, was dort passiert, oder wir töten es einfach. Im Allgemeinen sind Pull-Requests eine häufige Sache.

Führen Sie einen Rollback durch, wenn ein Fehler auftritt? Haben Sie versucht, dies zu tun?

Nein, dies ist eine Entscheidung einer Person in dem Moment, in dem sie das Problem sieht.

Source: habr.com