{"id":98123,"date":"2020-10-24T14:42:52","date_gmt":"2020-10-24T12:42:52","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens"},"modified":"2020-11-18T00:58:49","modified_gmt":"2020-11-17T22:58:49","slug":"patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens","title":{"rendered":"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/ec13125c702f42863bbe774cd805442b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es scheint, dass die Terraform-Entwickler recht praktische Best Practices f\u00fcr die Arbeit mit AWS-Infrastruktur anbieten. Es gibt jedoch einen Haken. Mit der Zeit steigt die Anzahl der Umgebungen, und jede hat ihre eigenen Besonderheiten. Es entsteht quasi eine Kopie des Anwendungsstacks in einer benachbarten Region. Der Terraform-Code muss sorgf\u00e4ltig kopiert und an die neuen Anforderungen angepasst werden oder es muss eine Schneeflocke erstellt werden.<\/p>\n<p><\/p>\n<p>Mein Vortrag handelt von Mustern in Terraform zur Bek\u00e4mpfung von Chaos und manuellen Routinen in gro\u00dfen und langwierigen Projekten.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Video:<\/p>\n<p>\n<center><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/5f92845c017bf613f0899d88\" frameborder=\"0\" allowfullscreen><\/iframe><\/center><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/8c67c45e486d6c03793dd08c33a16313.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ich bin 40 Jahre alt und arbeite seit 20 Jahren in der IT. Seit 12 Jahren bin ich bei der Firma Ixtens t\u00e4tig. Wir besch\u00e4ftigen uns mit E-Commerce-gesteuerter Entwicklung. Und seit 5 Jahren praktiziere ich DevOps-Praktiken.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/8b14b3adaa45d69278d76580baa99042.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Meine Erz\u00e4hlung wird von meinen Erfahrungen in einem Projekt bei einer Firma handeln, deren Name ich aufgrund einer Geheimhaltungsvereinbarung nicht nennen werde. <\/p>\n<p><\/p>\n<p>Die Zahlen auf der Folie sind zur Veranschaulichung des Umfangs des Projekts angegeben. Alles, was ich weiter sagen werde, steht im Zusammenhang mit Amazon.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/3742217a2abaf1fcf2163979d82eac14.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ich habe mich vor 4 Jahren diesem Projekt angeschlossen. Zu diesem Zeitpunkt befand sich die Infrastruktur im vollst\u00e4ndigen Refactoring, weil das Projekt gewachsen war. Die Muster, die verwendet wurden, waren nicht mehr geeignet. Angesichts des geplanten Wachstums des Projekts musste etwas Neues erfunden werden. <\/p>\n<p><\/p>\n<p>Danke an Matvey, der mir gestern erz\u00e4hlt hat, was bei Dodo Pizza passiert ist. Das war das, was bei uns vor 4 Jahren passiert ist. <\/p>\n<p><\/p>\n<p>Die Entwickler kamen und begannen, Infrastruktur-Code zu schreiben. <\/p>\n<p><\/p>\n<p>Die offensichtlichsten Gr\u00fcnde, warum dies n\u00f6tig war, sind die Time-to-Market. Es musste sichergestellt werden, dass das DevOps-Team nicht der Engpass bei der Bereitstellung war. Au\u00dferdem wurden auf der ersten Ebene Terraform und Puppet eingesetzt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/13d6df6a324d2e1162acef77ca2ad0dc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Terraform ist ein Open-Source-Projekt von HashiCorp. F\u00fcr diejenigen, die \u00fcberhaupt nicht wissen, was das ist, die n\u00e4chsten Folien. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/61726d4205d1f4f8e449fe9d71507508.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Infrastruktur als Code bedeutet, dass wir unsere Infrastruktur beschreiben und einige Roboter bitten k\u00f6nnen, die Ressourcen bereitzustellen, die wir beschrieben haben.<\/p>\n<p><\/p>\n<p>Zum Beispiel brauchen wir <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/de\/vps\/abuzoustojchivye-vps\/\"   title=\"eine virtuelle Maschine\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"4196\">eine virtuelle Maschine<\/a>. Wir beschreiben es und f\u00fcgen einige obligatorische Parameter hinzu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/eb52c1e458fa092bba8577fffceb864c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Danach richten wir in der Konsole den Zugriff auf Amazon ein. Und wir bitten Terraform um einen Plan. Terraform wird sagen: \u201eOkay, f\u00fcr Ihre Ressource k\u00f6nnen wir folgende Dinge tun\u201c. Mindestens eine Ressource wird hinzugef\u00fcgt, und es sind keine \u00c4nderungen vorgesehen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/879e645596121ee5d05ac247b4be19ee.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sobald Sie mit allem zufrieden sind, k\u00f6nnen Sie Terraform anweisen, die \u00c4nderungen anzuwenden, und Terraform erstellt Ihnen eine Instanz, und Sie erhalten eine virtuelle Maschine in Ihrer Cloud.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/77b7fe4d6abcc9116233f48caa887465.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dann entwickelt sich unser Projekt weiter. Wir f\u00fcgen dort einige \u00c4nderungen hinzu. Wir bitten um mehr Instances, wir f\u00fcgen 53 Eintr\u00e4ge hinzu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/98ce7e1f9d1f85aa5e78c269a0708ac1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und wir wiederholen. Wir bitten um einen Plan. Wir sehen, welche \u00c4nderungen geplant sind. Wir wenden sie an. So w\u00e4chst unsere Infrastruktur. <\/p>\n<p><\/p>\n<p>Terraform verwendet so etwas wie State-Dateien. Das hei\u00dft, alle \u00c4nderungen, die an Amazon gesendet werden, werden in einer Datei gespeichert, in der f\u00fcr jede Ressource, die Sie beschrieben haben, die entsprechenden Ressourcen enthalten sind, die in Amazon erstellt wurden. Wenn sich also die Beschreibung einer Ressource \u00e4ndert, wei\u00df Terraform genau, was in Amazon ge\u00e4ndert werden muss.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/6e83efffb7af6ab967b4716be170b47b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Diese State-Dateien waren urspr\u00fcnglich einfach Dateien. Und wir haben sie in Git gespeichert, was \u00e4u\u00dferst unpraktisch war. Jemand hat st\u00e4ndig vergessen, die \u00c4nderungen zu committen, und es traten viele Konflikte auf. <\/p>\n<p><\/p>\n<p>Jetzt gibt es die M\u00f6glichkeit, ein Backend zu verwenden, d. h. Terraform wird angegeben, in welchem Bucket und unter welchem Schl\u00fcssel die State-Datei gespeichert werden soll. Terraform k\u00fcmmert sich selbst darum, diese State-Datei abzurufen, die gesamte Magie durchzuf\u00fchren und das Endergebnis zur\u00fcckzulegen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/e6687463a9fe3cff979f44ac7778b4e8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Unsere Infrastruktur w\u00e4chst. Hier ist unser Code. Und wir m\u00f6chten jetzt nicht einfach eine virtuelle Maschine erstellen, wir wollen eine Testumgebung haben.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/0effb09fa04d3d520c1cdbb34ce97810.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Terraform erm\u00f6glicht das Erstellen eines Moduls, d. h. dasselbe in einem bestimmten Ordner zu beschreiben.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/95c8395b10142fe550b0719161211f15.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und zum Beispiel im Testen dieses Modul aufzurufen und dasselbe zu erhalten, als ob wir Terraform apply im Modul selbst ausgef\u00fchrt h\u00e4tten. F\u00fcr den Test sieht der Code so aus.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/fa4c16e3835a4507a858d2ddb767daf3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>F\u00fcr die Produktion k\u00f6nnen wir dort einige \u00c4nderungen senden, da wir im Test keine gro\u00dfen Instances ben\u00f6tigen, in der Produktion sind gro\u00dfe Instances jedoch wirklich n\u00fctzlich.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/19478de23da2278567e66bacef78a0a9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und dann werde ich zur\u00fcck zum Projekt kommen. Es gab eine komplexe Aufgabe, die Infrastruktur war als sehr gro\u00df geplant. Und es musste irgendwie der gesamte Code organisiert werden, damit es f\u00fcr alle bequem ist: sowohl f\u00fcr diejenigen, die Wartung an diesem Code durchf\u00fchren, als auch f\u00fcr diejenigen, die \u00c4nderungen vornehmen. Es war geplant, dass jeder Entwickler hingehen und die Infrastruktur so anpassen kann, wie es f\u00fcr seinen Teil der Plattform notwendig ist. <\/p>\n<p><\/p>\n<p>Das ist der Ordnerbaum, der von HashiCorp selbst empfohlen wird, wenn Sie ein gro\u00dfes Projekt haben und es sinnvoll ist, die gesamte Infrastruktur in einige kleine St\u00fccke zu teilen und jedes St\u00fcck in einem separaten Ordner zu beschreiben. <\/p>\n<p><\/p>\n<p>Mit einer umfangreichen Bibliothek von Ressourcen kann man im Test und in der Produktion ungef\u00e4hr dasselbe aufrufen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/c30cdc3d3ce5441bc0ae4a485069dacc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In unserem Fall passte das nicht so ganz, da der Test-Stack f\u00fcr Entwickler oder f\u00fcr Tests einfacher beschafft werden musste. Es war nicht angenehm, durch Ordner zu suchen und sie in der richtigen Reihenfolge anzuwenden und sich Sorgen zu machen, dass die Datenbank hochf\u00e4hrt und dann das Instance, das diese Datenbank nutzt. Daher wurde das gesamte Testing aus einem einzigen Ordner gestartet. Dort wurden dieselben Module aufgerufen, aber alles lief in einem Durchgang ab.<\/p>\n<p><\/p>\n<p>Terraform k\u00fcmmert sich um alle Abh\u00e4ngigkeiten. Und es erstellt die Ressourcen immer in der Reihenfolge, sodass man beispielsweise die IP-Adresse von einem neu erstellten Instance erhalten kann und diese IP-Adresse in einer route53-Aufzeichnung erh\u00e4lt. <\/p>\n<p><\/p>\n<p>Au\u00dferdem ist die Plattform sehr gro\u00df. Und das Starten eines Test-Stacks, selbst f\u00fcr eine Stunde oder acht Stunden \u2013 das ist eine ziemlich kostspielige Angelegenheit. <\/p>\n<p><\/p>\n<p>Und wir haben das automatisiert. Der Jenkins-Job erm\u00f6glichte es, den Stack zu starten. Man musste einen Pull-Request mit den \u00c4nderungen starten, die der Entwickler testen wollte, sowie alle ben\u00f6tigten Optionen, Komponenten und Gr\u00f6\u00dfen angeben. Wenn er Performance-Tests m\u00f6chte, kann er mehr Instances nehmen. Wenn er nur \u00fcberpr\u00fcfen m\u00f6chte, ob ein bestimmtes Formular ge\u00f6ffnet wird, konnte er mit den Minimalanforderungen starten. Au\u00dferdem konnte man angeben, ob ein Cluster ben\u00f6tigt wird oder nicht, usw. <\/p>\n<p><\/p>\n<p>Und dann pushte Jenkins ein Shell-Skript, das den Code im Terraform-Ordner ein wenig modifizierte. Es entfernte unn\u00f6tige Dateien und f\u00fcgte ben\u00f6tigte Dateien hinzu. Und dann wurde der Stack in einem Durchgang mit Terraform apply hochgefahren. <\/p>\n<p><\/p>\n<p>Danach folgten weitere Schritte, in die ich nicht n\u00e4her einsteigen m\u00f6chte. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/b288c0b320d8cb6e282db994bc1c1f43.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Da wir f\u00fcr das Testing etwas mehr Optionen ben\u00f6tigten als in der Produktion, mussten wir Kopien der Module erstellen, damit wir in diesen Kopien die Funktionen hinzuf\u00fcgen konnten, die nur f\u00fcr das Testing gebraucht wurden. <\/p>\n<p><\/p>\n<p>So kam es, dass man im Testing gerne die \u00c4nderungen testen m\u00f6chte, die letztlich in die Produktion gehen. Aber tats\u00e4chlich wurde etwas anderes getestet, und in der Produktion wurde etwas anderes angewendet. Es gab eine kleine Diskrepanz, da in der Produktion alle \u00c4nderungen vom Operationsteam umgesetzt wurden. Manchmal kam es vor, dass die \u00c4nderungen, die aus dem Testing in die Produktion \u00fcbergehen sollten, in einer anderen Version blieben. <\/p>\n<p><\/p>\n<p>Dar\u00fcber hinaus gab es das Problem, dass ein neuer Service hinzugef\u00fcgt wurde, der sich ein wenig von einem bereits bestehenden unterschied. Anstatt das bestehende Modul zu modifizieren, war es notwendig, eine Kopie davon zu erstellen und die erforderlichen \u00c4nderungen vorzunehmen. <\/p>\n<p><\/p>\n<p>Im Grunde genommen ist Terraform keine echte Sprache. Es ist eine Deklaration. Wenn wir etwas deklarieren m\u00fcssen, dann tun wir das. Und alles funktioniert.<\/p>\n<p><\/p>\n<p>In einem Moment, als einer meiner Pull-Requests besprochen wurde, sagte ein Kollege, dass man keine Schneeflocken erzeugen sollte. Ich war neugierig, was er damit meinte. Es gibt eine wissenschaftliche Tatsache, dass es auf der Welt keine zwei identischen Schneeflocken gibt, sie unterscheiden sich immer ein wenig. Und als ich das h\u00f6rte, sp\u00fcrte ich sofort das Gewicht des Terraform-Codes. Denn wenn es erforderlich war, von einer Version auf die n\u00e4chste zu wechseln, verlangte Terraform eine breaking chain \u00c4nderung, d. h. der Code war nicht mehr mit der n\u00e4chsten Version kompatibel. Dadurch musste ein Pull-Request erstellt werden, der fast die H\u00e4lfte der Dateien in der Infrastruktur abdeckte, um die Infrastruktur auf die n\u00e4chste Version von Terraform zu bringen.<\/p>\n<p><\/p>\n<p>Und nachdem so eine Schneeflocke entstanden war, verwandelte sich der gesamte Terraform-Code, den wir hatten, in einen riesigen Schneehaufen. <\/p>\n<p><\/p>\n<p>F\u00fcr einen externen Entwickler, der au\u00dferhalb des Betriebs arbeitet, spielt das keine gro\u00dfe Rolle, weil er einen Pull-Request erstellt hat, sein Ressourcen gestartet wurde. Und das war's, weiter ist es nicht seine Sorge. Das DevOps-Team, das darauf achtet, dass alles in Ordnung ist, muss all diese \u00c4nderungen vornehmen. Und die Kosten f\u00fcr diese \u00c4nderungen stiegen mit jeder zus\u00e4tzlichen Schneeflocke erheblich.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/d07039414027798861d1424bb2c686b6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es gibt eine Geschichte \u00fcber einen Studenten, der in einem Seminar mit Kreide zwei perfekte Kreise an die Tafel malt. Der Dozent ist erstaunt, wie es ihm gelungen ist, so gleichm\u00e4\u00dfig ohne Zirkel zu zeichnen. Der Student antwortet: \"Ganz einfach, ich habe zwei Jahre lang in der Armee eine Fleischmaschine gedreht.\" <\/p>\n<p><\/p>\n<p>In den vier Jahren, in denen ich an diesem Projekt beteiligt bin, besch\u00e4ftige ich mich etwa zwei Jahre mit Terraform. Und nat\u00fcrlich habe ich einige Tricks, einige Ratschl\u00e4ge, wie man Terraform-Code vereinfachen, mit ihm wie mit einer Programmiersprache arbeiten und die Belastung der Entwickler reduzieren kann, die diesen Code aktuell halten m\u00fcssen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/9413c6adf1933482dcc822b021773df9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zuerst m\u00f6chte ich mit Symlinks beginnen. Terraform hat viel sich wiederholenden Code. Zum Beispiel wird der Provider an fast jedem Punkt aufgerufen, an dem wir ein St\u00fcck Infrastruktur erstellen. Es w\u00e4re logisch, ihn in einen separaten Ordner auszulagern. Und \u00fcberall dort, wo der Provider ben\u00f6tigt wird, sollten Symlinks auf diese Datei gemacht werden. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/6dcf36cc8c94e7a70cf6ab1456cc1215.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zum Beispiel verwenden Sie in der Produktion eine Assume-Rolle, die es Ihnen erm\u00f6glicht, Zugriffsrechte f\u00fcr ein externes Amazon-Konto zu erhalten. Indem Sie eine Datei \u00e4ndern, haben alle anderen im Ressourcenbaum die erforderlichen Berechtigungen, damit Terraform wei\u00df, auf welchen Amazon-Segment zuzugreifen ist. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/6df9a89ef48ae9a7adda7fb1f86b76aa.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wo funktionieren Symlinks nicht? Wie bereits erw\u00e4hnt, gibt es in Terraform Statusdateien. Und diese sind wirklich sehr gut. Das Problem ist, dass Terraform das Backend beim ersten Mal initialisiert. Und er kann in diesen Parametern keine Variablen verwenden, diese m\u00fcssen immer schriftlich angegeben werden. <\/p>\n<p><\/p>\n<p>Das Ergebnis ist, dass, wenn jemand eine neue Ressource erstellt, er einen Teil des Codes aus anderen Ordnern kopiert. Und er k\u00f6nnte einen Fehler mit dem Schl\u00fcssel oder dem Bucket machen. Zum Beispiel erstellt er etwas im Sandbox-Modus und dann in der Produktion. So k\u00f6nnte es passieren, dass der Bucket in der Produktion aus der Sandbox verwendet wird. Nat\u00fcrlich wird das schnell gefunden. Es k\u00f6nnte irgendwie behoben werden, aber dennoch ist das Zeitverschwendung und in gewissem Ma\u00dfe Ressourcenverlust. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/757294dc6a1a27fc4a5fe174cc4aa7d7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Was k\u00f6nnen wir als N\u00e4chstes tun? Bevor Sie mit Terraform arbeiten, m\u00fcssen Sie es initialisieren. W\u00e4hrend der Initialisierung l\u00e4dt Terraform alle Plugins herunter. Diese wurden irgendwann aus einem Monolithen in eine mikroserviceorientierte Architektur zerlegt. Und es ist immer erforderlich, Terraform init auszuf\u00fchren, damit es alle Module und Plugins abruft.<\/p>\n<p><\/p>\n<p>Und Sie k\u00f6nnen ein Shell-Skript verwenden, das erstens alle Variablen abrufen kann. Ein Shell-Skript ist in nichts beschr\u00e4nkt. Und zweitens die Pfade. Wenn wir immer den Pfad verwenden, der im Repository als Schl\u00fcssel zur Statusdatei fungiert, wird ein Fehler in diesem Fall ausgeschlossen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/b70dbc6d8edb1b255c64d722a7e40680.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Woher kommen die Daten? Aus einer JSON-Datei. Terraform erm\u00f6glicht es, Infrastruktur nicht nur in hcl (HashiCorp Configuration Language), sondern auch in JSON zu beschreiben.<\/p>\n<p><\/p>\n<p>JSON l\u00e4sst sich leicht aus einem Shell-Skript lesen. Dementsprechend k\u00f6nnen Sie an einem Ort eine Konfigurationsdatei mit einem Bucket ablegen. Und diesen Bucket sowohl im Terraform-Code als auch im Shell-Skript zur Initialisierung verwenden. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/a18b92cac763003ec49af8d4a37e19d9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Warum ist es wichtig, einen Bucket f\u00fcr Terraform zu haben? Weil es so etwas wie Remote State-Dateien gibt. Das hei\u00dft, wenn ich eine Ressource bereitstelle, muss ich Amazon sagen: \"Bitte stelle eine Instanz bereit\", und daf\u00fcr muss ich viele erforderliche Parameter angeben. <\/p>\n<p><\/p>\n<p>Diese Identifikatoren werden in einem anderen Ordner gespeichert. Ich kann also sagen: \"Terraform, gehe bitte in die State-Datei dieser Ressource und hol mir diese Identifikatoren zur\u00fcck.\" So entsteht eine gewisse Einheitlichkeit zwischen verschiedenen Regionen oder Umgebungen.<\/p>\n<p><\/p>\n<p>Es ist nicht immer m\u00f6glich, eine Remote State-Datei zu verwenden. Zum Beispiel, wenn Sie manuell ein VPC erstellt haben. Der Terraform-Code, der das VPC erstellt, kann so unterschiedlich sein, dass Sie sehr lange brauchen werden, um ihn an das andere anzupassen. Daher gibt es einen Trick. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/04ffcd97e2fae323d9b4d81e5f6c751a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das hei\u00dft, machen Sie ein Modul, das wie ein VPC funktioniert und Ihnen die Identifikatoren gibt, aber eigentlich gibt es nur eine Datei mit fest kodierten Werten, die zur Erstellung derselben Instanz verwendet werden kann.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/9cd878c459f377caf5af9bf27b026187.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es ist nicht immer erforderlich, die State-Datei in der Cloud zu speichern. Wenn Sie Module testen, k\u00f6nnen Sie eine Backend-Initialisierung verwenden, bei der die Datei einfach auf der Festplatte w\u00e4hrend des Tests gespeichert wird.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/70fee8d4105cfddacafeec00825127b5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jetzt ein bisschen \u00fcber das Testen. Was kann man in Terraform testen? Wahrscheinlich kann man viel testen, aber ich werde \u00fcber diese vier Punkte sprechen.<\/p>\n<p><\/p>\n<p>HashiCorp hat ein Verst\u00e4ndnis daf\u00fcr, wie der Terraform-Code formatiert werden sollte. Und Terraform fmt erm\u00f6glicht es Ihnen, den Code, den Sie bearbeiten, gem\u00e4\u00df dieser Auffassung zu formatieren. Daher sollten die Tests unbedingt \u00fcberpr\u00fcfen, ob die Formatierung dem entspricht, was HashiCorp hinterlassen hat, damit Sie nicht die Position der Klammern \u00e4ndern m\u00fcssen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/bb99ffdd9f963f0f44ea7b5379689737.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Der n\u00e4chste Punkt ist Terraform validate. Es macht ein bisschen mehr als nur eine Syntaxpr\u00fcfung \u2013 etwa, ob alle Klammern passend sind. Was ist hier wichtig? Unsere Infrastruktur ist sehr weit verbreitet. Es gibt viele verschiedene Ordner. In jedem dieser Ordner muss Terraform validate ausgef\u00fchrt werden.<\/p>\n<p><\/p>\n<p>Um das Testen zu beschleunigen, f\u00fchren wir mehrere Prozesse parallel aus, indem wir Parallelit\u00e4t nutzen. <\/p>\n<p><\/p>\n<p>Parallelit\u00e4t ist eine gro\u00dfartige Funktion, nutzen Sie sie.<\/p>\n<p><\/p>\n<p>Aber jedes Mal, wenn die Initialisierung von Terraform erfolgt, geht er zu HashiCorp und fragt: \u201eWelche sind die neuesten Versionen der Plugins? Ist das Plugin, das ich im Cache habe, das richtige oder nicht?\u201c. Und das hat bei jedem Schritt seine Verz\u00f6gerung mit sich gebracht. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/836e90327c7a60c493f42f0a055e248b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wenn Terraform gesagt wird, wo die Plugins liegen, dann sagt Terraform: \u201eOkay, das ist wahrscheinlich das Neueste, was es gibt. Ich werde nicht woanders hingehen, ich werde sofort mit der Validierung Ihres Terraform-Codes beginnen.\u201c<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/8ab344cf8de7087d30a1212d44691c20.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Um den ben\u00f6tigten Plugins-Ordner zu f\u00fcllen, haben wir einen sehr einfachen Terraform-Code, den man einfach initialisieren muss. Hier m\u00fcssen nat\u00fcrlich alle Provider angegeben werden, die irgendwie in Ihrem Code verwendet werden, sonst sagt Terraform: \u201eIch kenne diesen Provider nicht, weil er nicht im Cache ist.\u201c<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/b8130753045624d38bce32ba08b56fb0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Der n\u00e4chste Schritt ist Terraform Plan. Wie bereits erw\u00e4hnt, ist die Entwicklung zyklisch. Wir erstellen Code mit \u00c4nderungen. Und dann muss man herausfinden, welche \u00c4nderungen an der Infrastruktur geplant sind. <\/p>\n<p><\/p>\n<p>Und wenn die Infrastruktur sehr, sehr gro\u00df ist, kann man ein Modul \u00e4ndern, eine Testumgebung reparieren oder eine spezifische Region beeinflussen und damit etwas Nachbarliches zerst\u00f6ren. Daher sollte Terraform Plan f\u00fcr die gesamte Infrastruktur durchgef\u00fchrt werden und zeigen, welche \u00c4nderungen geplant sind.<\/p>\n<p><\/p>\n<p>Das kann man schlau machen. Wir haben zum Beispiel ein Skript in Python geschrieben, das Abh\u00e4ngigkeiten aufl\u00f6st. Je nachdem, was ge\u00e4ndert wurde: Terraform-Modul oder einfach eine spezifische Komponente, macht es Pl\u00e4ne f\u00fcr alle abh\u00e4ngigen Ordner.<\/p>\n<p><\/p>\n<p>Terraform Plan sollte auf Anfrage durchgef\u00fchrt werden. Zumindest ist das, was wir tun. <\/p>\n<p><\/p>\n<p>Tests sind nat\u00fcrlich gut f\u00fcr jede \u00c4nderung, jeden Commit zu machen, aber Pl\u00e4ne sind eine recht kostspielige Angelegenheit. Und wir sagen in Pull Requests: \u201eBitte gib mir die Pl\u00e4ne.\u201c Ein Roboter wird aktiviert. Und er schickt in die Kommentare oder im Anhang alle Pl\u00e4ne, die sich aus Ihrer \u00c4nderung erwarten lassen. <\/p>\n<p><\/p>\n<p>Der Plan ist eine ziemlich teure Angelegenheit. Er ben\u00f6tigt Zeit, weil Terraform zu Amazon geht und fragt: \u201eExistiert dieser Instance noch? Hat dieser Autoscale genau diese Parameter?\u201c Und um das zu beschleunigen, kann man einen Parameter wie refresh=false verwenden. Das bedeutet, dass Terraform den State aus S3 herunterladen wird. Und es wird glauben, dass der State genau mit dem in Amazon \u00fcbereinstimmt.<\/p>\n<p><\/p>\n<p>Ein solcher Terraform-Plan l\u00e4uft deutlich schneller ab, aber der Zustand muss Ihrer Infrastruktur entsprechen, d. h. irgendwann muss ein Terraform-Refresh durchgef\u00fchrt werden. Terraform-Refresh sorgt daf\u00fcr, dass der Zustand dem entspricht, was sich in der realen Infrastruktur befindet. <\/p>\n<p><\/p>\n<p>Und ich muss \u00fcber die Sicherheit sprechen. Damit h\u00e4tte man anfangen m\u00fcssen. Dort, wo Sie Terraform ausf\u00fchren und Terraform mit Ihrer Infrastruktur arbeitet, gibt es eine Sicherheitsanf\u00e4lligkeit. Das hei\u00dft, Sie f\u00fchren im Grunde genommen Code aus. Und wenn der Pull-Request schadhafter Code enth\u00e4lt, kann dieser in der Infrastruktur ausgef\u00fchrt werden, die zu viel Zugriff hat. Deshalb seien Sie vorsichtig, wo Sie den Terraform-Plan ausf\u00fchren.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/2153cc01acf2b1f46978f837b82b317e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Als N\u00e4chstes m\u00f6chte ich \u00fcber das Testen von User-Data sprechen.<\/p>\n<p><\/p>\n<p>Was ist User-Data? Bei Amazon, wenn wir eine Instanz erstellen, k\u00f6nnen wir von der Instanz eine Art Mitteilung senden \u2013 Metadaten. Wenn die Instanz gestartet wird, ist cloud-init normalerweise immer auf diesen Instanzen vorhanden. Cloud-init liest diese Mitteilung und sagt: \u201eOkay, heute bin ich ein Lastenausgleich\u201c. Und in \u00dcbereinstimmung mit diesen Vorgaben f\u00fchrt es bestimmte Aktionen aus.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/406ac9341e102f5e0d7ca239d10675cd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aber leider sieht User-Data, wenn wir Terraform-Plan und Terraform-Anwendung durchf\u00fchren, wie ein solcher Brei aus Zahlen aus. Das hei\u00dft, es schickt Ihnen einfach einen Hash. Und das Einzige, was Sie im Plan sehen k\u00f6nnen, ist, ob es irgendwelche \u00c4nderungen gibt oder ob der Hash gleich bleibt. <\/p>\n<p><\/p>\n<p>Und wenn man dem keine Beachtung schenkt, kann auf Amazon ein kleiner besch\u00e4digter Textdatei in die echte Infrastruktur gelangen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/cd7b56f1149d9cbebb0ad3228c0eeb5f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Als Option kann man bei der Ausf\u00fchrung angeben, nicht die gesamte Infrastruktur, sondern nur das Template. Und im Code sagen: \u201eBitte zeige mir dieses Template an\u201c. So kann man einen Ausdruck erhalten, wie Ihre Daten auf Amazon aussehen werden.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/86da779cdf7f9cacfd80a196efde47f7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Eine andere M\u00f6glichkeit besteht darin, ein Modul zur Generierung von User-Data zu verwenden. Sie setzen dieses Modul ein, erhalten eine Datei auf der Festplatte und vergleichen sie mit dem Referenzdokument. Und so, wenn irgendein Junior beschlie\u00dft, ein bisschen User-Data zu \u00e4ndern, werden Ihre Tests sagen: \u201eOkay, hier und hier gibt es einige \u00c4nderungen \u2013 das ist in Ordnung\u201c.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/7e69ec1b2c04710066d93ee48f872254.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Als N\u00e4chstes m\u00f6chte ich \u00fcber die Automatisierung von Terraform-Anwendungen sprechen.<\/p>\n<p><\/p>\n<p>Nat\u00fcrlich ist es ziemlich be\u00e4ngstigend, Terraform-Anwendungen automatisch auszuf\u00fchren, denn wer wei\u00df schon, welche \u00c4nderungen dort vorgenommen wurden und wie verheerend sie f\u00fcr die Live-Infrastruktur sein k\u00f6nnen. <\/p>\n<p><\/p>\n<p>F\u00fcr die Testumgebung ist das alles in Ordnung. Das hei\u00dft, der Job, der die Testumgebung erstellt, ist das, was alle Entwickler brauchen. Und solche Ausdr\u00fccke wie \u201ebei mir hat alles funktioniert\u201c sind kein witziges Meme, sondern der Beweis, dass der Mensch sich damit besch\u00e4ftigt hat, den Stack hochgefahren hat, irgendwelche Tests auf diesem Stack ausgef\u00fchrt hat und sich vergewissert hat, dass alles in Ordnung ist, und gesagt hat: \u201eOkay, der Code, den ich ver\u00f6ffentlichte, wurde getestet.\u201c<\/p>\n<p><\/p>\n<p>In Produktions-, Sandbox- und anderen Umgebungen, die f\u00fcr das Gesch\u00e4ft wichtiger sind, kann man teilweise einige Ressourcen ausreichend sicher anwenden, da dies nicht dazu f\u00fchrt, dass jemand stirbt. Dazu geh\u00f6ren: Autoscale-Gruppen, Sicherheitsgruppen, Rollen, Route53, und die Liste kann ziemlich lang sein. Aber achten Sie darauf, was passiert, lesen Sie Berichte \u00fcber automatische Anwendungen. <\/p>\n<p><\/p>\n<p>Dort, wo die Anwendung gef\u00e4hrlich oder riskant ist, zum Beispiel wenn es um persistente Ressourcen aus Datenbanken geht, erhalten Sie Berichte dar\u00fcber, dass in einem bestimmten Teil der Infrastruktur nicht angewendete \u00c4nderungen vorliegen. Und der Ingenieur startet unter Aufsicht Jobs, um diese anzuwenden, oder f\u00fchrt dies \u00fcber seine Konsole durch. <\/p>\n<p><\/p>\n<p>Bei Amazon gibt es so etwas wie Terminate Protection. Und es kann in einigen F\u00e4llen vor unerw\u00fcnschten \u00c4nderungen sch\u00fctzen. Das hei\u00dft, Terraform geht zu Amazon und sagt: \u201eIch muss diese Instanz t\u00f6ten, um eine andere zu machen.\u201c Und Amazon sagt: \u201eEntschuldigung, nicht heute. Wir haben die Terminate Protection aktiviert.\u201c<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/9f4258d8688556829586a1e308f5a1e2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und das Sahneh\u00e4ubchen ist die Code-Optimierung. Wenn wir mit Terraform-Code arbeiten, m\u00fcssen wir in das Modul eine sehr gro\u00dfe Anzahl von Parametern \u00fcbergeben. Das sind die Parameter, die erforderlich sind, um eine Ressource zu erstellen. Und der Code verwandelt sich in gro\u00dfe Listen von Parametern, die von Modul zu Modul, von Modul zu Modul \u00fcbergeben werden m\u00fcssen, besonders wenn die Module verschachtelt sind. <\/p>\n<p><\/p>\n<p>Und das ist sehr schwer lesbar. Es ist sehr schwierig, eine \u00dcberpr\u00fcfung durchzuf\u00fchren. Und es kommt sehr oft vor, dass einige Parameter die \u00dcberpr\u00fcfung bestehen und sie nicht ganz die sind, die ben\u00f6tigt werden. Das kostet Zeit und Geld, um sie sp\u00e4ter zu korrigieren.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/ad7e8a91692212fda9f2561854b881c9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Deshalb empfehle ich Ihnen, so etwas wie einen komplexen Parameter zu verwenden, der eine Art Baum von Werten enth\u00e4lt. Das hei\u00dft, Sie ben\u00f6tigen einen bestimmten Ordner, in dem alle Werte angegeben sind, die Sie in einer bestimmten Umgebung haben m\u00f6chten.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/909632949eb30057bf86b116239d9077.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Durch den Aufruf dieses Moduls kann man einen Baum erhalten, der in einem gemeinsamen Modul generiert wird, d. h. in einem Modul, das f\u00fcr die gesamte Infrastruktur gleich funktioniert.<\/p>\n<p><\/p>\n<p>In diesem Modul k\u00f6nnen einige Berechnungen angestellt werden, indem man eine so frische Funktion in Terraform wie locals nutzt. Und dann kann man mit einem Output einen komplexen Parameter ausgeben, der beispielsweise Hashes, Arrays usw. enthalten kann. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/25c14e0397f8d95c301e0dfe6ae761df.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das sind alle besten Erkenntnisse, die ich habe. Ich m\u00f6chte eine Anekdote \u00fcber Kolumbus erz\u00e4hlen. Als er nach Geldern f\u00fcr seine Expedition suchte, um Indien zu entdecken (so glaubte er damals), glaubte ihm niemand und man hielt es f\u00fcr unm\u00f6glich. Dann sagte er: 'Macht es so, dass das Ei nicht f\u00e4llt.' Alle Banker, sehr reiche und wahrscheinlich kluge Menschen, versuchten auf irgendeine Weise, das Ei zu stellen, aber es fiel immer wieder. Dann nahm Kolumbus das Ei, dr\u00fcckte ein wenig darauf. Die Schale lie\u00df nach und das Ei blieb stehen. Sie sagten: 'Oh, das ist viel zu einfach!' Und Kolumbus antwortete: 'Ja, das ist viel zu einfach. Und wenn ich Indien entdecke, werden alle diesen Handelsweg nutzen.' <\/p>\n<p><\/p>\n<p>Das, was ich Ihnen jetzt erz\u00e4hlt habe, sind wahrscheinlich ziemlich einfache und triviale Dinge. Und wenn man davon erf\u00e4hrt und beginnt, sie anzuwenden, ist das in Ordnung. Also nutzen Sie es. Und wenn das f\u00fcr Sie ganz normale Dinge sind, wissen Sie zumindest, wie man ein Ei stellt, damit es nicht f\u00e4llt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/37bf83d04b99f089f2319c8d2e8aaeb4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lassen Sie uns zusammenfassen: <\/p>\n<p><\/p>\n<ul>\n<li>Versuchen Sie, Schneeflocken zu vermeiden. Je weniger Schneeflocken, desto weniger Ressourcen ben\u00f6tigen Sie, um \u00c4nderungen in Ihrer gesamten gro\u00dfen Infrastruktur vorzunehmen. <\/li>\n<li>St\u00e4ndige \u00c4nderungen. Das hei\u00dft, wenn es im Code \u00c4nderungen gegeben hat, m\u00fcssen Sie Ihre Infrastruktur so schnell wie m\u00f6glich an diese \u00c4nderungen anpassen. Es sollte nicht vorkommen, dass jemand nach zwei oder drei Monaten kommt, um sich Elasticsearch anzusehen, einen Terraform-Plan macht und dabei mit vielen \u00c4nderungen konfrontiert wird, die er nicht erwartet hat. Dabei wird viel Zeit darauf verwendet, alles wieder in Ordnung zu bringen. <\/li>\n<li>Tests und Automatisierung. Je mehr Ihr Code durch Tests und Features abgedeckt ist, desto mehr Vertrauen haben Sie in das, was Sie richtig machen. Und die automatisierte Bereitstellung wird Ihr Vertrauen erheblich steigern. <\/li>\n<li>Der Code f\u00fcr die Test- und Produktionsumgebung sollte praktisch identisch sein. Praktisch, weil die Produktionsumgebung dennoch etwas anders ist und es dort einige Nuancen geben wird, die \u00fcber die Testumgebung hinausgehen. Dennoch kann man das plus-minus sicherstellen. <\/li>\n<li>Und wenn Sie sehr viel Terraform-Code haben und die Pflege dieses Codes sehr viel Zeit in Anspruch nimmt, ist es nie zu sp\u00e4t, ein Refactoring durchzuf\u00fchren und ihn in eine gute Form zu bringen. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/68f3946536f44eed33939b234fb3ca0d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Immutable Infrastructure. Lieferung von AMI nach Zeitplan. <\/li>\n<li>Struktur f\u00fcr Route53, wenn Sie sehr viele Eintr\u00e4ge haben und m\u00f6chten, dass sie in einer konsistenten Reihenfolge sind. <\/li>\n<li>Bek\u00e4mpfung von API-Rate-Limits. Das passiert, wenn Amazon sagt: \u201eDas ist alles, ich kann keine Anfragen mehr annehmen, bitte warten Sie.\u201c Und die H\u00e4lfte der Firma wartet, bis sie ihre Infrastruktur starten kann. <\/li>\n<li>Spot-Instanzen. Amazon ist kein g\u00fcnstiges Unternehmen und Spots erm\u00f6glichen es, erheblich zu sparen. Dar\u00fcber k\u00f6nnte man einen ganzen Vortrag halten. <\/li>\n<li>Sicherheit und IAM-Rollen. <\/li>\n<li>Suche nach verlorenen Ressourcen, wenn Sie in Amazon Instanzen unbekannter Herkunft haben, die Geld kosten. Selbst wenn eine Instanz 100-150 Dollar im Monat kostet, summiert sich das \u00fcber ein Jahr auf mehr als 1.000 Dollar. Die Suche nach solchen Ressourcen ist ein profitables Gesch\u00e4ft. <\/li>\n<li>Und reservierte Instanzen. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/69ddbf4c726bcc15aea1a1e2d67a3fc8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das ist alles von meiner Seite. Terraform ist wirklich gro\u00dfartig, nutzen Sie es. Danke!<\/p>\n<p><\/p>\n<p>Fragen<\/p>\n<p><\/p>\n<p><em>Danke f\u00fcr den Vortrag! Ihre State-Datei liegt in S3, aber wie gehen Sie mit dem Problem um, dass mehrere Personen diese State-Datei nehmen und versuchen, sich bereitzustellen?<\/em><\/p>\n<p><\/p>\n<p>Erstens, wir hetzen nicht. Zweitens gibt es Flags, mit denen wir mitteilen, dass wir an einem bestimmten Abschnitt des Codes arbeiten. Das hei\u00dft, obwohl die Infrastruktur sehr gro\u00df ist, bedeutet das nicht, dass st\u00e4ndig jemand etwas anwendet. Und als die aktive Phase war, war das ein Problem; unsere State-Dateien wurden in Git gespeichert. Das war wichtig, denn sonst h\u00e4tte jemand eine State-Datei erstellt, und wir h\u00e4tten sie manuell zusammenstellen m\u00fcssen, damit alles weitergehen kann. Dieses Problem gibt es jetzt nicht mehr. Insgesamt hat Terraform dieses Problem gel\u00f6st. Und wenn sich st\u00e4ndig etwas \u00e4ndert, k\u00f6nnen Sie Locks verwenden, die verhindern, was Sie gesagt haben.<\/p>\n<p><\/p>\n<p><em>Verwenden Sie die Open-Version oder Enterprise?<\/em><\/p>\n<p><\/p>\n<p>Kein Enterprise, d.h. alles, was man herunterladen kann, ist kostenlos. <\/p>\n<p><\/p>\n<p><em>Ich hei\u00dfe Stanislav. Ich wollte eine kleine Erg\u00e4nzung machen. Sie haben \u00fcber die Amazon-Funktion gesprochen, die es erm\u00f6glicht, eine Instanz unzerst\u00f6rbar zu machen. Das gibt es auch in Terraform, im Block Life Second kann man ein Verbot zur \u00c4nderung oder zur Zerst\u00f6rung festlegen.<\/em> <\/p>\n<p><\/p>\n<p>Ich war zeitlich begrenzt. Gute Anmerkung. <\/p>\n<p><\/p>\n<p><em>Ich wollte noch zwei Dinge fragen. Erstens, Sie haben \u00fcber Tests gesprochen. Haben Sie irgendwelche Tools zum Testen verwendet? Ich habe von dem Plugin Test Kitchen geh\u00f6rt. Vielleicht gibt es noch etwas anderes. Und ich wollte auch nach Local Values fragen. Was unterscheidet sie prinzipiell von Input Variables? Und warum kann ich nicht etwas nur \u00fcber Local Values parametrieren? Ich habe versucht, mich mit diesem Thema auseinanderzusetzen, aber irgendwie nicht verstanden.<\/em><\/p>\n<p><\/p>\n<p>Wir k\u00f6nnen ausf\u00fchrlicher nach diesem Raum sprechen. Die Tools f\u00fcr Tests \u2013 das ist unser eigener Kram. Es gibt nichts, was getestet werden k\u00f6nnte. Tats\u00e4chlich gibt es Optionen, wenn automatische Tests Infrastruktur irgendwo hochfahren, \u00fcberpr\u00fcfen, dass sie in Ordnung ist, und dann alles mit einem Bericht l\u00f6schen, dass Ihre Infrastruktur weiterhin in gutem Zustand ist. Das haben wir nicht, weil die Test-Stacks jeden Tag hochgefahren werden. Das reicht aus. Und wenn etwas zu brechen beginnt, dann beginnt es zu brechen, ohne dass wir das noch woanders \u00fcberpr\u00fcfen. <\/p>\n<p><\/p>\n<p>Zum Thema Local Values lassen Sie uns das Gespr\u00e4ch au\u00dferhalb des Raumes fortsetzen. <\/p>\n<p><\/p>\n<p><em>Hallo! Danke f\u00fcr den Vortrag! Sehr lehrreich. Du hast gesagt, dass ihr sehr viel einheitlichen Code zur Beschreibung der Infrastruktur habt. Habt ihr nicht in Erw\u00e4gung gezogen, diesen Code zu generieren?<\/em><\/p>\n<p><\/p>\n<p>Tolle Frage, danke! Das Problem ist, dass wir, wenn wir Infrastruktur als Code verwenden, annehmen, dass wir den Code betrachten und verstehen, welche Infrastruktur hinter diesem Code steckt. Wenn der Code generiert wird, m\u00fcssen wir uns vorstellen, welcher Code generiert wird, um zu verstehen, welche Infrastruktur es geben wird. Oder wir generieren den Code, committen ihn und es ist im Grunde dasselbe. Daher sind wir den Weg gegangen, den wir geschrieben haben, und so haben wir es bekommen. Au\u00dferdem sind Generatoren etwas sp\u00e4ter aufgetaucht, als wir angefangen haben. Und es war bereits zu sp\u00e4t, um etwas zu \u00e4ndern.<\/p>\n<p><\/p>\n<p><em>Hast du schon einmal etwas \u00fcber Jsonnet geh\u00f6rt?<\/em><\/p>\n<p><\/p>\n<p>Nein. <\/p>\n<p><\/p>\n<p><em>Schau mal, das ist eine echt coole Sache. Ich sehe einen konkreten Anwendungsfall, wo man es anwenden und Datenstrukturen generieren kann.<\/em> <\/p>\n<p><\/p>\n<p>Generatoren sind gut, wie im Witz \u00fcber einen Rasierer. Das hei\u00dft, beim ersten Mal sieht man unterschiedlich aus, aber danach haben alle das gleiche Gesicht. Generatoren sind echt klasse. Aber leider haben wir ein etwas anderes Gesicht. Das ist ein Problem. <\/p>\n<p><\/p>\n<p><em>Schau einfach mal. Danke!<\/em><\/p>\n<p><\/p>\n<p><em>Ich hei\u00dfe Maxim, ich komme von der Sberbank. Sie haben ein wenig erz\u00e4hlt, dass Sie versucht haben, Terraform an eine Programmiersprache anzupassen. Ist es nicht einfacher, Ansible zu verwenden?<\/em><\/p>\n<p><\/p>\n<p>Das sind sehr unterschiedliche Dinge. Man kann mit Ansible Ressourcen erstellen und mit Puppet kann man Ressourcen in Amazon erstellen. Aber Terraform ist speziell daf\u00fcr konzipiert. <\/p>\n<p><\/p>\n<p><em>Haben Sie nur Amazon?<\/em><\/p>\n<p><\/p>\n<p>Es geht nicht darum, dass wir nur Amazon haben. Fast ausschlie\u00dflich Amazon. Aber das Hauptmerkmal ist, dass Terraform sich merkt. Bei Ansible, wenn du sagst: \u201eErstelle mir 5 Instanzen\u201c, dann erstellt er sie, und wenn du sagst: \u201eJetzt brauche ich 3\u201c, wird Terraform sagen: \u201eOkay, ich l\u00f6sche 2\u201c, w\u00e4hrend Ansible sagen wird: \u201eOkay, hier sind 3\u201c. Insgesamt also 8.<\/p>\n<p><\/p>\n<p><em>Hallo! Vielen Dank f\u00fcr Ihren Vortrag! Es war sehr interessant, \u00fcber Terraform zu h\u00f6ren. Ich m\u00f6chte sofort einen kleinen Kommentar abgeben, dass Terraform immer noch keine stabile Version hat, also seien Sie mit Terraform vorsichtig.<\/em><\/p>\n<p><\/p>\n<p>Gut Ding will Weile haben. Das hei\u00dft, wenn Sie eine L\u00f6sung ben\u00f6tigen, dann schieben Sie manchmal das Unstabile und so weiter beiseite, aber es funktioniert und hat uns geholfen. <\/p>\n<p><\/p>\n<p><em>Ich habe eine Frage. Sie verwenden Remote-Backend, Sie verwenden S3. Warum benutzen Sie nicht das offizielle Backend?<\/em><\/p>\n<p><\/p>\n<p>Offiziell?<\/p>\n<p><\/p>\n<p><em>Terraform Cloud.<\/em><\/p>\n<p><\/p>\n<p>Wann ist es erschienen?<\/p>\n<p><\/p>\n<p><em>Vor etwa 4 Monaten.<\/em> <\/p>\n<p><\/p>\n<p>Wenn es vor 4 Jahren erschienen w\u00e4re, h\u00e4tte ich wahrscheinlich Ihre Frage beantwortet.<\/p>\n<p><\/p>\n<p><em>Dort gibt es bereits eingebaute Funktionen und Locks, und man kann die State-Datei speichern. Probieren Sie es aus. Ich habe es auch nicht getestet.<\/em><\/p>\n<p><\/p>\n<p>Wir fahren in einem gro\u00dfen Zug, der mit hoher Geschwindigkeit f\u00e4hrt. Man kann nicht einfach ein paar Waggons rauswerfen. <\/p>\n<p><\/p>\n<p><em>Sie sprachen \u00fcber Schneeflocken, warum haben Sie keinen Branch verwendet? Warum hat das nicht funktioniert?<\/em><\/p>\n<p><\/p>\n<p>Wir haben den Ansatz, dass die gesamte Infrastruktur in einem Repository ist. Terraform, Puppet, alle Skripte, die irgendwie dazu geh\u00f6ren, sind alle in einem Repository. Auf diese Weise k\u00f6nnen wir garantieren, dass inkrementelle \u00c4nderungen nacheinander getestet werden. Wenn es viele Branches w\u00e4ren, w\u00e4re so ein Projekt praktisch unm\u00f6glich zu warten. Es vergehen sechs Monate, und sie weichen so weit auseinander, dass es einfach eine Qual wird. Das ist das, wovor wir uns bis zur Refaktorisierung dr\u00fccken wollten. <\/p>\n<p><\/p>\n<p><em>Das hei\u00dft, es funktioniert nicht?<\/em><\/p>\n<p><\/p>\n<p>Das funktioniert \u00fcberhaupt nicht.<\/p>\n<p><\/p>\n<p>Im Branch habe ich den Ordnerslide herausgeschnitten. Das hei\u00dft, wenn wir f\u00fcr jedes Test-Framework einen eigenen Ordner einrichten, zum Beispiel hat Team A seinen eigenen Ordner, Team B hat seinen eigenen Ordner, dann funktioniert das auch nicht. Wir haben einen einheitlichen Code f\u00fcr die Testumgebung erstellt, der flexibel genug war, um allen zu passen. Das hei\u00dft, wir hatten einen Code, der gewartet wurde. <\/p>\n<p><\/p>\n<p><em>Hallo! Ich hei\u00dfe Jura! Danke f\u00fcr den Vortrag! Eine Frage zu den Modulen. Sie sagten, dass Sie Module verwenden. Wie gehen Sie damit um, wenn in einem Modul \u00c4nderungen vorgenommen wurden, die nicht mit den \u00c4nderungen eines anderen Benutzers kompatibel sind? Versionieren Sie die Module irgendwie oder versuchen Sie, eine \u201eWunderwaffe\u201c zu finden, um zwei Anforderungen gerecht zu werden?<\/em><\/p>\n<p><\/p>\n<p>Das ist das Problem eines gro\u00dfen Schneeballs. Das ist das, was wir erleiden, wenn eine harmlose \u00c4nderung einen Teil der Infrastruktur kaputt machen kann. Und das wird sich erst nach einer langen Zeit bemerkbar machen.<\/p>\n<p><\/p>\n<p><em>Das hei\u00dft, es wird bisher nicht gel\u00f6st?<\/em><\/p>\n<p><\/p>\n<p>Sie machen universelle Module. Vermeiden Sie Schneeflocken. Dann wird alles gut. Der zweite Teil des Vortrags handelt davon, wie man das vermeiden kann.<\/p>\n<p><\/p>\n<p><em>Guten Tag! Danke f\u00fcr den Vortrag! Ich wollte nachfragen. Im Hintergrund blieb ein gro\u00dfer Brocken, wegen dem ich hierher gekommen bin. Wie sind Puppet und die Rollenzuweisung integriert?<\/em><\/p>\n<p><\/p>\n<p>User-data.<\/p>\n<p><\/p>\n<p><em>Das hei\u00dft, Sie spucken einfach eine Datei aus und f\u00fchren sie damit irgendwie aus?<\/em><\/p>\n<p><\/p>\n<p>User-data ist eine Notiz, das hei\u00dft, wenn wir ein Abbild klonen, dann wird ein Daemon gestartet, und um herauszufinden, wer er ist, liest er die Notiz, dass er ein Load Balancer ist.<\/p>\n<p><\/p>\n<p><em>Das hei\u00dft, das ist ein separater Prozess, der \u00fcbergeben wird?<\/em><\/p>\n<p><\/p>\n<p>Wir haben ihn nicht erfunden. Wir benutzen ihn. <\/p>\n<p><\/p>\n<p><em>Guten Tag! Ich habe eine Frage zu User-data. Sie sagten, dass es dort Probleme gibt, weil jemand etwas falsch \u00fcbermitteln k\u00f6nnte. Gibt es eine M\u00f6glichkeit, die User-data im gleichen Git zu speichern, damit immer klar ist, worauf sich die User-data bezieht?<\/em><\/p>\n<p><\/p>\n<p>Wir generieren User-data aus der Vorlage. Das hei\u00dft, es gibt eine bestimmte Anzahl von Variablen. Und Terraform generiert das Endergebnis. Daher kann man nicht einfach auf die Vorlage schauen und sagen, was herauskommt, denn alle Probleme h\u00e4ngen damit zusammen, dass der Entwickler denkt, dass er in dieser Variablen eine Zeichenkette \u00fcbergibt, w\u00e4hrend es tats\u00e4chlich ein Array ist. Und dann passiert es \u2013 zack, ich habe das und das, n\u00e4chste Zeile, und alles ist kaputt. Wenn es sich um eine neue Ressource handelt und jemand sie aufsetzt, sieht er, dass etwas nicht funktioniert, und das l\u00e4sst sich schnell l\u00f6sen. Aber wenn es sich um eine aktualisierte Autoscale-Gruppe handelt, fangen irgendwann die Instanzen in der Autoscale-Gruppe an, sich zu \u00e4ndern. Und pl\u00f6tzlich funktioniert etwas nicht mehr. Das ist \u00e4rgerlich.<\/p>\n<p><\/p>\n<p><em>Bedeutet das, dass die einzige L\u00f6sung ist \u2013 zu testen?<\/em><\/p>\n<p><\/p>\n<p>Ja, du siehst das Problem, du f\u00fcgst Testschritte hinzu. Das hei\u00dft, auch das Output kann getestet werden. Vielleicht nicht so bequem, aber du kannst auch einige Markierungen setzen \u2013 \u00fcberpr\u00fcfe, dass User-data hier mit N\u00e4geln fixiert ist. <\/p>\n<p><\/p>\n<p><em>Mein Name ist Timur. Es ist wirklich gro\u00dfartig, dass es Vortr\u00e4ge dar\u00fcber gibt, wie man Terraform richtig organisiert.<\/em><\/p>\n<p><\/p>\n<p>Ich habe noch nicht einmal angefangen.<\/p>\n<p><\/p>\n<p><em>Ich denke, dass es auf der n\u00e4chsten Konferenz vielleicht m\u00f6glich sein wird. Ich habe eine einfache Frage. Warum hardcodest du den Wert in einem separaten Modul, anstatt tfvars zu verwenden, das hei\u00dft, was ist besser an einem Modul mit Werten als an tfvars?<\/em><\/p>\n<p><\/p>\n<p>Das hei\u00dft, ich m\u00fcsste hier (Slide: Production\/environment\/settings.tf) schreiben: domain = Variable, domain vpcnetwork, Variable vpcnetwork und stvars \u2013 das Gleiche herausbekommen?<\/p>\n<p><\/p>\n<p><em>Das machen wir genau so. Wir beziehen uns auf das Modul source setting, zum Beispiel.<\/em><\/p>\n<p><\/p>\n<p>Im Wesentlichen ist das so etwas wie tfvars. Tfvars ist im Testumfeld sehr bequem. Ich habe tfvars f\u00fcr gro\u00dfe Instanzen, f\u00fcr kleine. Und ich habe eine Datei in den Ordner gesch\u00fcttelt. Und habe das, was ich wollte. Wenn wir die Infrastruktur ausbauen, m\u00f6chten wir, dass man schauen und sofort alles verstehen kann. Aber so ist es so, dass man hier einen Blick werfen und dann in die tfvars schauen muss.<\/p>\n<p><\/p>\n<p><em>Bedeutet das, dass alles an einem Ort sein sollte?<\/em><\/p>\n<p><\/p>\n<p>Ja, tfvars ist, wenn du einen Code hast. Und er wird an mehreren verschiedenen Stellen mit unterschiedlichen Nuancen verwendet. Dann w\u00fcrdest du tfvars verwenden und deine Nuancen erhalten. Und wir \u2013 das ist Infrastruktur als Code in reinster Form. Du schauest und verstehst. <\/p>\n<p><\/p>\n<p><em>Hallo! Hatten Sie schon einmal Situationen, in denen der Cloud-Anbieter in das eingreift, was Sie mit Terraform gemacht haben? Angenommen, wir \u00e4ndern Metadaten. Dort sind SSH-Schl\u00fcssel. Und Google f\u00fcgt st\u00e4ndig seine Metadaten und Schl\u00fcssel hinzu. Und Terraform sagt immer, dass es \u00c4nderungen gibt. Nach jedem Durchlauf, selbst wenn sich nichts \u00e4ndert, sagt es immer, dass es dieses Feld aktualisieren wird.<\/em><\/p>\n<p><\/p>\n<p>Mit den Schl\u00fcsseln, aber ja, ein Teil der Infrastruktur ist von so etwas betroffen, d. h. Terraform kann nichts \u00e4ndern. Wir k\u00f6nnen auch nichts manuell \u00e4ndern. Wir leben einfach damit.<\/p>\n<p><\/p>\n<p><em>Das hei\u00dft, Sie sind damit konfrontiert, haben aber nichts entworfen, es macht einfach und macht einfach weiter?<\/em><\/p>\n<p><\/p>\n<p>Leider ja. <\/p>\n<p><\/p>\n<p><em>Hallo! Ich hei\u00dfe Stanislav Starkov. Mail.ru Gruppe. Wie l\u00f6sen Sie das Problem mit der Generierung des Tags auf ..., wie \u00fcbertragen Sie ihn? Ich verstehe, \u00fcber User \u2014 data, um den Hostnamen anzugeben, Puppet zu verwenden? Und die zweite Frage. Wie l\u00f6sen Sie dieses Problem in SG, d. h. wenn Sie SG generieren, Hundert gleichartige Instanzen, wie benennen Sie sie richtig?<\/em><\/p>\n<p><\/p>\n<p>Die Instanzen, die uns sehr wichtig sind, benennen wir sch\u00f6n. Die, die nicht ben\u00f6tigt werden, haben einen Zusatz, dass es sich um eine Autoscale-Gruppe handelt. Und theoretisch k\u00f6nnte man das abschalten und eine neue erhalten. <\/p>\n<p><\/p>\n<p>In Bezug auf das Problem mit dem Tag gibt es kein solches Problem, sondern eine solche Aufgabe. Und Tags werden bei uns sehr stark verwendet, weil die Infrastruktur gro\u00df und teuer ist. Wir m\u00fcssen sehen, wohin das Geld flie\u00dft, deshalb erm\u00f6glichen uns Tags, herauszufinden, was und wohin ausgegeben wurde. Und entsprechend die Suche nach dem, wo viel Geld ausgegeben wird. <\/p>\n<p><\/p>\n<p>Wor\u00fcber war noch die Frage?<\/p>\n<p><\/p>\n<p><em>Wenn SG hundert Instanzen erstellt, m\u00fcssen sie irgendwie unterschieden werden?<\/em><\/p>\n<p><\/p>\n<p>Nein, das ist nicht n\u00f6tig. Auf jeder Instanz gibt es einen Agenten, der meldet, dass es ein Problem gibt. Wenn der Agent meldet, dann wei\u00df der Agent auch von ihm und zumindest existiert seine IP-Adresse. Man kann schon loslegen. Zweitens verwenden wir Consul f\u00fcr Discovery, wo es kein Kubernetes gibt. Und Consul zeigt auch die IP-Adresse der Instanz an.<\/p>\n<p><\/p>\n<p><em>Das hei\u00dft, Sie orientieren sich genau an der IP, und nicht am Hostnamen?<\/em><\/p>\n<p><\/p>\n<p>Es ist unm\u00f6glich, sich am Hostnamen zu orientieren, d. h. es gibt sehr viele. Es gibt Instanzidentifikatoren \u2013 AE usw. Man kann ihn irgendwo finden, man kann ihn in die Suche eingeben. <\/p>\n<p><\/p>\n<p><em>Hallo! Ich habe verstanden, dass Terraform eine gute Sache ist, die f\u00fcr Clouds ausgelegt ist.<\/em> <\/p>\n<p><\/p>\n<p>Nicht nur. <\/p>\n<p><\/p>\n<p><em>Genau diese Frage interessiert mich. Wenn Sie sich entscheiden, massenhaft auf Bare Metal mit all Ihren Instanzen zu migrieren? Wird es keine Probleme geben? Oder m\u00fcssen Sie doch auf andere Produkte zur\u00fcckgreifen, wie z. B. das hier erw\u00e4hnte Ansible?<\/em><\/p>\n<p><\/p>\n<p>Ansible ist ein bisschen anders. Das bedeutet, Ansible arbeitet bereits, wenn die Instanz gestartet ist. Terraform arbeitet, bevor die Instanz gestartet wurde. Der \u00dcbergang zu Bare Metal \u2013 nein. <\/p>\n<p><\/p>\n<p><em>Jetzt nicht, aber das Gesch\u00e4ft wird kommen und sagen: \u201eLass uns das machen\u201c.<\/em><\/p>\n<p><\/p>\n<p>Der Wechsel zu einer anderen Cloud \u2013 ja, aber hier gibt es einen etwas anderen Aspekt. Man muss den Terraform-Code so schreiben, dass man einfacher auf eine andere Cloud wechseln kann. <\/p>\n<p><\/p>\n<p>Urspr\u00fcnglich bestand die Aufgabe darin, unsere gesamte Infrastruktur cloud-unabh\u00e4ngig zu gestalten, d. h. jede Cloud sollte geeignet sein, aber irgendwann gab das Gesch\u00e4ft auf und sagte: \u201eOkay, in den n\u00e4chsten N Jahren gehen wir nirgendwohin, wir k\u00f6nnen die Dienste von Amazon nutzen\u201c.<\/p>\n<p><\/p>\n<p>Terraform erm\u00f6glicht es, Front-End-Jobs zu erstellen, PagerDuty zu konfigurieren, Daten-Dokumente usw. Es hat sehr viele M\u00f6glichkeiten. Es kann praktisch die ganze Welt kontrollieren.<\/p>\n<p><\/p>\n<p><em>Danke f\u00fcr den Vortrag! Ich arbeite jetzt auch seit 4 Jahren mit Terraform. In der \u00dcbergangsphase zu Terraform, zu Infrastruktur und der deklarativen Beschreibung, hatten wir Situationen, in denen jemand etwas manuell machte, w\u00e4hrend Sie versuchten, einen Plan zu erstellen. Und dabei bekamen Sie irgendeinen Fehler. Wie gehen Sie mit solchen Problemen um? Wie finden Sie verlorene Ressourcen, die angegeben waren?<\/em><\/p>\n<p><\/p>\n<p>Im Wesentlichen manuell und visuell, wenn wir im Bericht etwas Seltsames sehen, analysieren wir, was dort vor sich geht, oder wir eliminieren es einfach. Generell sind Pull-Requests ein allt\u00e4gliches Gesch\u00e4ft. <\/p>\n<p><\/p>\n<p><em>Wenn ein Fehler auftritt, machen Sie dann ein Rollback? Haben Sie das schon mal versucht?<\/em><\/p>\n<p><\/p>\n<p>Nein, das ist eine Entscheidung des Menschen in dem Moment, wenn er das Problem sieht.<\/p>\n<p>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/524712\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Terraform \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0435 best practices \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 AWS-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439. \u0422\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441. \u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u043a\u043e\u043f\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u043c \u0440\u0435\u0433\u0438\u043e\u043d\u0435. \u0418 Terraform-\u043a\u043e\u0434 \u043d\u0443\u0436\u043d\u043e \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043d\u043e\u0432\u044b\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043d\u0435\u0436\u0438\u043d\u043a\u0443. \u041c\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 Terraform \u0434\u043b\u044f \u0431\u043e\u0440\u044c\u0431\u044b \u0441 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":98124,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-98123","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 Terraform \u0434\u043b\u044f \u0431\u043e\u0440\u044c\u0431\u044b \u0441 \u0445\u0430\u043e\u0441\u043e\u043c \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 \u0440\u0443\u0442\u0438\u043d\u043e\u0439. \u041c\u0430\u043a\u0441\u0438\u043c \u041a\u043e\u0441\u0442\u0440\u0438\u043a\u0438\u043d (Ixtens) | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-10-24T12:42:52+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-11-17T22:58:49+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Muster in Terraform zur Bek\u00e4mpfung von Chaos und manueller Routine. Maxim Kostrykin (Ixtens) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 Terraform \u0434\u043b\u044f \u0431\u043e\u0440\u044c\u0431\u044b \u0441 \u0445\u0430\u043e\u0441\u043e\u043c \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 \u0440\u0443\u0442\u0438\u043d\u043e\u0439. \u041c\u0430\u043a\u0441\u0438\u043c \u041a\u043e\u0441\u0442\u0440\u0438\u043a\u0438\u043d (Ixtens) | ProHoster","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-10-24T12:42:52+00:00","article:modified_time":"2020-11-17T22:58:49+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"98123","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:04:35","updated":"2022-09-29 03:09:38","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/98123","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=98123"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/98123\/revisions"}],"predecessor-version":[{"id":164071,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/98123\/revisions\/164071"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/98124"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=98123"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=98123"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=98123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}