{"id":33123,"date":"2019-10-31T21:50:52","date_gmt":"2019-10-31T18:50:52","guid":{"rendered":"https:\/\/prohoster.info\/blog\/terraformer-infrastructure-to-code\/"},"modified":"2019-10-31T21:50:52","modified_gmt":"2019-10-31T18:50:52","slug":"terraformer-infrastructure-to-code","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/terraformer-infrastructure-to-code","title":{"rendered":"Terraformer \u2014 Infrastructure To Code","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Terraformer \u2014 Infrastructure To Code\" src=\"\/wp-content\/uploads\/2019\/05\/d97414f6b4608dbb4ec7f582b7001773.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIch m\u00f6chte \u00fcber ein neues CLI-Tool berichten, das ich geschrieben habe, um ein altes Problem zu l\u00f6sen. <\/p>\n<h3>Das Problem<\/h3>\n<p>\nTerraform ist l\u00e4ngst zum Standard in der DevOps-, Cloud- und IT-Community geworden. Es ist ein \u00e4u\u00dferst praktisches und hilfreiches Tool f\u00fcr Infrastructure as Code. Terraform hat viele Vorz\u00fcge sowie seine Fallstricke und Herausforderungen. <br \/>\nMit Terraform lassen sich neue Dinge einfach umsetzen und anschlie\u00dfend verwalten, \u00e4ndern oder l\u00f6schen. Aber was ist mit denjenigen, die eine umfangreiche Cloud-Infrastruktur besitzen, die nicht mit Terraform erstellt wurde? Alles neu zu schreiben und die gesamte Cloud neu zu erstellen, ist teuer und riskant. <br \/>\nIch habe dieses Problem in beiden meiner bisherigen Jobs erlebt. Ein einfaches Beispiel ist, wenn man alles in Git als Terraform-Dateien haben m\u00f6chte, aber \u00fcber 250 Buckets hat. Alle diese manuell f\u00fcr Terraform zu erstellen, ist ziemlich aufwendig. <br \/>\nEs gibt <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/hashicorp\/terraform\/issues\/581\">war das Problem<\/a><\/noindex> Seit 2014 gab es in Terraform eine Funktion, die 2016 eingestellt wurde, in der Hoffnung, dass eine Importfunktion kommen w\u00fcrde.<\/p>\n<p>Im Grunde sieht alles wie auf dem Bild aus, nur von rechts nach links.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Hinweis: Der Autor lebt seit Jahren au\u00dferhalb von Russland und schreibt kaum auf Russisch. Seien Sie vorsichtig wegen m\u00f6glicher Rechtschreibfehler.<\/p>\n<h3>L\u00f6sungen<\/h3>\n<p>\n1. Es gibt eine bew\u00e4hrte und alte L\u00f6sung f\u00fcr AWS. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dtan4\/terraforming\">terraforming<\/a><\/noindex>. Als ich versuchte, meine 250+ Buckets \u00fcber ihn abzurufen, wurde mir klar, dass vieles nicht stimmte. AWS hat seit langem viele neue Optionen hinzugef\u00fcgt, von denen Terraforming keine Kenntnis hat, und das gesamte System basiert auf Ruby. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dtan4\/terraforming\/blob\/master\/lib\/terraforming\/template\/tf\/s3.erb\">Die Vorlage wirkt sp\u00e4rlich.<\/a><\/noindex>. Nach 2 Uhr nachmittags habe ich gesendet. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dtan4\/terraforming\/pull\/396\">Pull Request<\/a><\/noindex> , um mehr Funktionen hinzuzuf\u00fcgen, und mir wurde klar, dass dieser Ansatz \u00fcberhaupt nicht geeignet ist. <br \/>\nWie funktioniert Terraforming? Es nimmt Daten von der AWS SDK und generiert tf- und tfstate-Dateien \u00fcber die Vorlage. <br \/>\nHier gibt es 3 Probleme:<br \/>\n1. Es wird immer eine Verz\u00f6gerung bei den Updates geben.<br \/>\n2. tf-Dateien sind manchmal besch\u00e4digt. <br \/>\n3. tfstate wird separat von tf gesammelt und stimmt nicht immer \u00fcberein.<br \/>\nEs ist generell schwierig, ein Ergebnis zu erzielen, bei dem `terraform plan` sagt, dass es keine \u00c4nderungen gibt.<\/p>\n<p>2. `terraform import` ist ein integrierter Befehl in Terraform. Wie funktioniert das? <br \/>\nDu schreibst eine leere TF-Datei mit dem Namen und dem Typ der Ressource, dann startest du `terraform import` und \u00fcbergibst die ID der Ressource. Terraform kontaktiert den Provider, erh\u00e4lt die Daten und erstellt die tfstate-Datei. <br \/>\nHier gibt es 3 Probleme:<br \/>\n1. Wir erhalten nur die tfstate-Datei, w\u00e4hrend die tf-Datei leer bleibt und manuell geschrieben oder aus der tfstate konvertiert werden muss.<br \/>\n2. Es kann nur mit einer Ressource gleichzeitig arbeiten und unterst\u00fctzt nicht alle Ressourcen. Was soll ich also wieder mit 250+ Buckets tun?<br \/>\n3. Man muss die IDs der Ressourcen kennen \u2013 das hei\u00dft, man muss diese in einen Code einbinden, der die Liste der Ressourcen abruft.<br \/>\nDas Ergebnis ist im Allgemeinen teilweise und l\u00e4sst sich nicht gut skalieren.<\/p>\n<h3>Meine L\u00f6sung.<br \/>\n<\/h3>\n<p>Anforderungen:<br \/>\n1. M\u00f6glichkeit, tf- und tfstate-Dateien f\u00fcr die Ressourcen zu erstellen. Zum Beispiel alle Buckets\/Sicherheitsgruppen\/Lastenausgleichsrampen herunterladen und sicherstellen, dass `terraform plan` anzeigt, dass keine \u00c4nderungen vorhanden sind.<br \/>\n2. Zwei Clouds: GCP + AWS.<br \/>\n3. Eine globale L\u00f6sung, die sich leicht bei jeder Aktualisierung anpassen l\u00e4sst und nicht f\u00fcr jede Ressource drei Tage Arbeit kostet.<br \/>\n4. Open Source machen \u2013 dieses Problem haben viele.<\/p>\n<p>Sprache Go \u2013 ich mag sie, und es gibt eine Bibliothek zur Erstellung von HCL-Dateien, die in Terraform verwendet wird, plus viel n\u00fctzlichen Code in Terraform.<\/p>\n<h3>Weg.<\/h3>\n<p>\nErster Versuch.<br \/>\nIch begann mit einer einfachen Variante. Zugriff auf die Cloud \u00fcber das SDK, um die ben\u00f6tigte Ressource abzurufen und sie in Felder f\u00fcr Terraform zu konvertieren. Der Versuch scheiterte sofort bei der Sicherheitsgruppe, weil ich 1,5 Tage damit verbracht habe, nur die Sicherheitsgruppe zu konvertieren (es gibt viele Ressourcen). Das ist langwierig, und sp\u00e4ter k\u00f6nnen die Felder ge\u00e4ndert oder hinzugef\u00fcgt werden.<\/p>\n<p>Zweiter Versuch.<br \/>\nBasierend auf der beschriebenen Idee. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/hashicorp\/terraform\/issues\/15608\">hier<\/a><\/noindex>. Einfach tfstate in tf konvertieren. Alle Daten sind vorhanden und die Felder sind gleich. Wie erh\u00e4lt man einen vollst\u00e4ndigen tfstate f\u00fcr mehrere Ressourcen? Hier hilft der Befehl `terraform refresh`. Terraform entnimmt alle Ressourcen aus dem tfstate und zieht die Daten \u00fcber die ID und schreibt alles in den tfstate. Das bedeutet, man erstellt einen leeren tfstate nur mit Namen und ID, f\u00fchrt `terraform refresh` aus und erh\u00e4lt einen vollst\u00e4ndigen tfstate. Hurra!<br \/>\nJetzt konzentrieren wir uns auf das rekursive Schreiben eines Konverters von tfstate zu tf. F\u00fcr diejenigen, die noch nie von tfstate geh\u00f6rt haben, es handelt sich um JSON, aber auf besondere Weise. <br \/>\nHier ist der wichtige Teil der attributes<\/p>\n<pre><code class=\"javascript\"> \"attributes\": {\n                            \"id\": \"default\/backend-logging-load-deployment\",\n                            \"metadata.#\": \"1\",\n                            \"metadata.0.annotations.%\": \"0\",\n                            \"metadata.0.generate_name\": \"\",\n                            \"metadata.0.generation\": \"24\",\n                            \"metadata.0.labels.%\": \"1\",\n                            \"metadata.0.labels.app\": \"backend-logging\",\n                            \"metadata.0.name\": \"backend-logging-load-deployment\",\n                            \"metadata.0.namespace\": \"default\",\n                            \"metadata.0.resource_version\": \"109317427\",\n                            \"metadata.0.self_link\": \"\/apis\/apps\/v1\/namespaces\/default\/deployments\/backend-logging-load-deployment\",\n                            \"metadata.0.uid\": \"300ecda1-4138-11e9-9d5d-42010a8400b5\",\n                            \"spec.#\": \"1\",\n                            \"spec.0.min_ready_seconds\": \"0\",\n                            \"spec.0.paused\": \"false\",\n                            \"spec.0.progress_deadline_seconds\": \"600\",\n                            \"spec.0.replicas\": \"1\",\n                            \"spec.0.revision_history_limit\": \"10\",\n                            \"spec.0.selector.#\": \"1\",\n<\/code><\/pre>\n<p>\nHier gibt es:<br \/>\n1. id \u2014 Zeichenfolge<br \/>\n2. metadata \u2014 Array der Gr\u00f6\u00dfe 1, das ein Objekt mit den folgenden Feldern enth\u00e4lt<br \/>\n3. spec \u2014 Hash der Gr\u00f6\u00dfe 1, der key,value enth\u00e4lt<br \/>\nKurz gesagt, ein unterhaltsames Format, das auch mehrere Ebenen tief sein kann<\/p>\n<pre><code class=\"javascript\">                   \"spec.#\": \"1\",\n                            \"spec.0.min_ready_seconds\": \"0\",\n                            \"spec.0.paused\": \"false\",\n                            \"spec.0.progress_deadline_seconds\": \"600\",\n                            \"spec.0.replicas\": \"1\",\n                            \"spec.0.revision_history_limit\": \"10\",\n                            \"spec.0.selector.#\": \"1\",\n                            \"spec.0.selector.0.match_expressions.#\": \"0\",\n                            \"spec.0.selector.0.match_labels.%\": \"1\",\n                            \"spec.0.selector.0.match_labels.app\": \"backend-logging-load\",\n                            \"spec.0.strategy.#\": \"0\",\n                            \"spec.0.template.#\": \"1\",\n                            \"spec.0.template.0.metadata.#\": \"1\",\n                            \"spec.0.template.0.metadata.0.annotations.%\": \"0\",\n                            \"spec.0.template.0.metadata.0.generate_name\": \"\",\n                            \"spec.0.template.0.metadata.0.generation\": \"0\",\n                            \"spec.0.template.0.metadata.0.labels.%\": \"1\",\n                            \"spec.0.template.0.metadata.0.labels.app\": \"backend-logging-load\",\n                            \"spec.0.template.0.metadata.0.name\": \"\",\n                            \"spec.0.template.0.metadata.0.namespace\": \"\",\n                            \"spec.0.template.0.metadata.0.resource_version\": \"\",\n                            \"spec.0.template.0.metadata.0.self_link\": \"\",\n                            \"spec.0.template.0.metadata.0.uid\": \"\",\n                            \"spec.0.template.0.spec.#\": \"1\",\n                            \"spec.0.template.0.spec.0.active_deadline_seconds\": \"0\",\n                            \"spec.0.template.0.spec.0.container.#\": \"1\",\n                            \"spec.0.template.0.spec.0.container.0.args.#\": \"3\"<\/code><\/pre>\n<p>\nWenn Sie eine Programmieraufgabe f\u00fcr ein Vorstellungsgespr\u00e4ch w\u00fcnschen, fragen Sie einfach nach der Erstellung eines Parsers daf\u00fcr \ud83d\ude42<br \/>\nNach zahlreichen Versuchen, einen fehlerfreien Parser zu schreiben, habe ich einen Teil davon im Terraform-Code gefunden, und zwar den entscheidenden Teil. Und scheinbar hat alles gut funktioniert.<\/p>\n<p>Versuch drei<br \/>\nEin Terraform-Provider ist eine Bin\u00e4rdatei, die den Code mit allen Ressourcen und der Logik zur Arbeit mit den Cloud-APIs enth\u00e4lt. Jede Cloud hat ihren eigenen Provider, und Terraform ruft diese \u00fcber sein RPC-Protokoll zwischen zwei Prozessen auf.<br \/>\nJetzt habe ich beschlossen, direkt \u00fcber RPC-Aufrufe auf die Terraform-Provider zuzugreifen. Das hat sich als elegant herausgestellt und erm\u00f6glicht es, Terraform-Provider gegen neuere auszutauschen und neue Funktionen zu erhalten, ohne den Code \u00e4ndern zu m\u00fcssen. Au\u00dferdem stellte sich heraus, dass nicht alle Felder im tfstate im tf enthalten sein m\u00fcssen. Aber wie erf\u00e4hrt man das? Man muss nur den Provider danach fragen. Dann begann ein weiteres Rekursionsvergn\u00fcgen bei der Erstellung von regul\u00e4ren Ausdr\u00fccken und der Suche nach Feldern im tfstate auf allen Ebenen.<\/p>\n<p>Am Ende ist ein n\u00fctzliches CLI-Tool entstanden, das eine gemeinsame Infrastruktur f\u00fcr alle Terraform-Provider bietet und das Hinzuf\u00fcgen neuer Provider einfach macht. Zudem erfordert das Hinzuf\u00fcgen von Ressourcen nur wenig Code. Au\u00dferdem gibt es n\u00fctzliche Features wie Verbindungen zwischen Ressourcen. Nat\u00fcrlich gab es viele verschiedene Probleme, die man nicht alle beschreiben kann.<br \/>\nIch habe das Tool Terrafomer genannt. <\/p>\n<h3>Das Finale<\/h3>\n<p>\nMit Terrafomer haben wir 500-700.000 Zeilen tf- und tfstate-Code f\u00fcr zwei Clouds generiert. Wir konnten Legacy-Elemente \u00fcbernehmen und sie nur \u00fcber Terraform anpacken, ganz im Sinne der besten Ideen von Infrastructure as Code. Es ist einfach Magie, wenn man eine riesige Cloud hat und sie mit einem Befehl in Form von funktionierenden Terraform-Dateien erh\u00e4lt. Und danach geht es mit grep\/replace\/git und so weiter weiter.<\/p>\n<p>Ich habe die Probleme gel\u00f6st und die Berechtigungen gekl\u00e4rt. Am Donnerstag (02.05.19) habe ich es auf GitHub ver\u00f6ffentlicht. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/GoogleCloudPlatform\/terraformer\">github.com\/GoogleCloudPlatform\/terraformer<\/a><\/noindex><br \/>\nIch habe bereits 600 Sterne erhalten, 2 Pull-Requests zur Unterst\u00fctzung von OpenStack und Kubernetes. Gute R\u00fcckmeldungen. Das Projekt ist insgesamt n\u00fctzlich f\u00fcr die Leute.<br \/>\nIch empfehle es allen, die mit Terraform anfangen wollen, ohne alles neu zu schreiben. <br \/>\n\u00dcber Pull-Requests, Issues und Sterne w\u00fcrde ich mich freuen.<\/p>\n<p>Demo<br \/>\n<noindex><img decoding=\"async\" alt=\"Terraformer \u2014 Infrastructure To Code\" src=\"\/wp-content\/uploads\/2019\/05\/76f10055b9106590f72c4e22e4d4e6d5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/noindex><br \/>\n<br \/>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/450410\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0425\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043d\u043e\u0432\u044b\u0439 CLI tool \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0430\u0440\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 Terraform \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u0441\u0442\u0430\u043b \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c \u0432 Devops\/Cloud\/IT \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435. \u0412\u0435\u0449\u044c \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0447\u0442\u043e\u0431 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u0441\u044f infrastructure as code. \u0415\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u043b\u0435\u0441\u0442\u0435\u0439 \u0432 Terraform \u0430 \u0442\u0430\u043a \u0436\u0435 \u043c\u043d\u043e\u0433\u043e \u0432\u0438\u043b\u043e\u043a, \u043e\u0441\u0442\u0440\u044b\u0445 \u043d\u043e\u0436\u0435\u0439 \u0438 \u0433\u0440\u0430\u0431\u043b\u0435\u0439. \u0421 Terraform \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0432\u0435\u0449\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24869,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-33123","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0425\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043d\u043e\u0432\u044b\u0439 CLI tool \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0430\u0440\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 Terraform \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u0441\u0442\u0430\u043b \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c \u0432 Devops\/Cloud\/IT \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435. \u0412\u0435\u0449\u044c \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0447\u0442\u043e\u0431 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u0441\u044f infrastructure as code. \u0415\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u043b\u0435\u0441\u0442\u0435\u0439 \u0432 Terraform \u0430 \u0442\u0430\u043a \u0436\u0435 \u043c\u043d\u043e\u0433\u043e \u0432\u0438\u043b\u043e\u043a, \u043e\u0441\u0442\u0440\u044b\u0445 \u043d\u043e\u0436\u0435\u0439 \u0438 \u0433\u0440\u0430\u0431\u043b\u0435\u0439. \u0421 Terraform \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0432\u0435\u0449\u0438\" \/>\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\/terraformer-infrastructure-to-code\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\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\udd47Terraformer \u2014 Infrastructure To Code | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0425\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043d\u043e\u0432\u044b\u0439 CLI tool \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0430\u0440\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 Terraform \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u0441\u0442\u0430\u043b \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c \u0432 Devops\/Cloud\/IT \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435. \u0412\u0435\u0449\u044c \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0447\u0442\u043e\u0431 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u0441\u044f infrastructure as code. \u0415\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u043b\u0435\u0441\u0442\u0435\u0439 \u0432 Terraform \u0430 \u0442\u0430\u043a \u0436\u0435 \u043c\u043d\u043e\u0433\u043e \u0432\u0438\u043b\u043e\u043a, \u043e\u0441\u0442\u0440\u044b\u0445 \u043d\u043e\u0436\u0435\u0439 \u0438 \u0433\u0440\u0430\u0431\u043b\u0435\u0439. \u0421 Terraform \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0432\u0435\u0449\u0438\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/terraformer-infrastructure-to-code\" \/>\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=\"2019-10-31T18:50:52+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:50:52+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\udd47Terraformer \u2014 Infrastructure To Code | ProHoster","description":"Ich m\u00f6chte Ihnen ein neues CLI-Tool vorstellen, das ich entwickelt habe, um ein altes Problem zu l\u00f6sen. Terraform hat sich l\u00e4ngst als Standard in der DevOps-, Cloud- und IT-Community etabliert. Es ist ein \u00e4u\u00dferst n\u00fctzliches und praktisches Tool f\u00fcr Infrastructure as Code. Terraform bietet viele Vorteile, hat aber auch seine Fallstricke und Herausforderungen. Mit Terraform l\u00e4sst sich sehr gut Neues umsetzen.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/terraformer-infrastructure-to-code","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\udd47Terraformer \u2014 Infrastructure To Code | ProHoster","og:description":"\u0425\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043d\u043e\u0432\u044b\u0439 CLI tool \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0430\u0440\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 Terraform \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u0441\u0442\u0430\u043b \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c \u0432 Devops\/Cloud\/IT \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435. \u0412\u0435\u0449\u044c \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0447\u0442\u043e\u0431 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u0441\u044f infrastructure as code. \u0415\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u043b\u0435\u0441\u0442\u0435\u0439 \u0432 Terraform \u0430 \u0442\u0430\u043a \u0436\u0435 \u043c\u043d\u043e\u0433\u043e \u0432\u0438\u043b\u043e\u043a, \u043e\u0441\u0442\u0440\u044b\u0445 \u043d\u043e\u0436\u0435\u0439 \u0438 \u0433\u0440\u0430\u0431\u043b\u0435\u0439. \u0421 Terraform \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0432\u0435\u0449\u0438","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/terraformer-infrastructure-to-code","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":"2019-10-31T18:50:52+00:00","article:modified_time":"2019-10-31T18:50:52+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"33123","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":"2026-01-21 14:02:48","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:46:23","updated":"2026-01-21 14:02:48"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/33123","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=33123"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/33123\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/24869"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=33123"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=33123"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=33123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}