{"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 von einem neuen CLI-Tool erz\u00e4hlen, das ich entwickelt habe, um ein altes Problem zu l\u00f6sen. <\/p>\n<h3>Problem<\/h3>\n<p>\nTerraform ist l\u00e4ngst zum Standard in der DevOps-\/Cloud-\/IT-Community geworden. Es ist sehr praktisch und hilfreich, um Infrastruktur als Code zu verwalten. Es gibt viele Vorteile bei Terraform, aber auch viele Fallstricke, scharfe Messer und Stolpersteine. <br \/>\nMit Terraform ist es sehr einfach, neue Dinge zu erstellen und diese dann zu verwalten, zu \u00e4ndern oder zu l\u00f6schen. Aber was ist mit denen, die eine riesige Infrastruktur in der Cloud haben, die nicht mit Terraform erstellt wurde? Alles neu zu schreiben und die gesamte Cloud neu zu erstellen, ist ziemlich teuer und riskant. <br \/>\nIch habe dieses Problem in zwei Jobs erlebt, das einfachste Beispiel ist, wenn man m\u00f6chte, dass alles in Git in Form von Terraform-Dateien ist, aber man hat \u00fcber 250 Buckets und es ist irgendwie viel, sie manuell f\u00fcr Terraform zu schreiben. <br \/>\nJa <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/hashicorp\/terraform\/issues\/581\">issue<\/a><\/noindex> Seit 2014 gab es Terraform, das 2016 eingestellt wurde, in der Hoffnung, dass eine Importfunktion kommen w\u00fcrde.<\/p>\n<p>Kurz gesagt, es ist alles wie auf dem Bild, nur von rechts nach links.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Warnung: Der Autor lebt seit einem halben Leben nicht in Russland und schreibt nicht viel auf Russisch. Vorsicht, Fehler in der Rechtschreibung.<\/p>\n<h3>L\u00f6sungen<\/h3>\n<p>\n1. Es gibt fertige und alte L\u00f6sungen f\u00fcr AWS. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dtan4\/terraforming\">terraforming<\/a><\/noindex>. Als ich versuchte, \u00fcber 250 Buckets damit zu erhalten, stellte ich fest, dass es viele Probleme gab. AWS hat seit langem viele neue Optionen hinzugef\u00fcgt, von denen terraforming nichts wei\u00df, und au\u00dferdem ist es in Ruby geschrieben. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dtan4\/terraforming\/blob\/master\/lib\/terraforming\/template\/tf\/s3.erb\">Die Templates sehen sp\u00e4rlich aus.<\/a><\/noindex>. Nach zwei Abenden habe ich <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dtan4\/terraforming\/pull\/396\">einen Pull-Request<\/a><\/noindex> gesendet, um mehr Funktionen hinzuzuf\u00fcgen, und verstand, dass solche L\u00f6sungen \u00fcberhaupt nicht geeignet sind. <br \/>\nSo funktioniert terraforming: Es nimmt Daten von SDK AWS und generiert tf und tfstate durch Templates. <br \/>\nHier gibt es drei Probleme:<br \/>\n1. Es wird immer eine Verz\u00f6gerung bei den Updates geben.<br \/>\n2. Die tf-Dateien sind manchmal besch\u00e4digt. <br \/>\n3. tfstate wird separat von tf gesammelt und stimmt nicht immer \u00fcberein.<br \/>\nEs ist insgesamt schwierig, ein Ergebnis zu erzielen, bei dem `terraform plan` sagt, dass es keine \u00c4nderungen gibt.<\/p>\n<p>2. `terraform import` \u2014 ist ein integrierter Befehl in Terraform. Wie funktioniert das? <br \/>\nMan schreibt eine leere TF-Datei mit dem Namen und Typ der Ressource, dann f\u00fchrt man `terraform import` aus und \u00fcbergibt die ID der Ressource. Terraform kontaktiert den Provider, erh\u00e4lt die Daten und erstellt die tfstate-Datei. <br \/>\nHier gibt es drei Probleme:<br \/>\n1. Man bekommt nur die tfstate-Datei, und die tf ist leer, muss manuell geschrieben oder von der tfstate konvertiert werden.<br \/>\n2. Es kann immer nur mit einer Ressource gleichzeitig arbeiten und unterst\u00fctzt nicht alle Ressourcen. Und was soll ich wieder mit \u00fcber 250 Buckets tun?<br \/>\n3. Man muss die ID der Ressourcen kennen - das hei\u00dft, man muss es in den Code einwickeln, der die Liste der Ressourcen abruft.<br \/>\nInsgesamt ist das Ergebnis teilweise und nicht gut skalierbar.<\/p>\n<h3>Meine L\u00f6sung<br \/>\n<\/h3>\n<p>Anforderungen:<br \/>\n1. M\u00f6glichkeit, tf- und tfstate-Dateien basierend auf Ressourcen zu erstellen. Zum Beispiel alle Buckets\/Sicherheitsgruppen\/Load Balancer herunterzuladen und was `terraform plan` zur\u00fcckgibt, dass keine \u00c4nderungen vorhanden sind.<br \/>\n2. Zwei Clouds GCP + AWS<br \/>\n3. Globale L\u00f6sung, die leicht aktualisiert werden kann, ohne jedes Mal drei Tage f\u00fcr jede Ressource zu verschwenden.<br \/>\n4. Open Source machen \u2013 jeder hat dieses Problem.<\/p>\n<p>Die Sprache Go \u2013 deshalb liebe ich sie, und es gibt eine Bibliothek zur Erstellung von HCL-Dateien, die in Terraform verwendet wird + viel Code in Terraform, der n\u00fctzlich sein kann.<\/p>\n<h3>Weg<\/h3>\n<p>\nErster Versuch<br \/>\nIch begann mit einer einfachen Variante. Anfragen an die Cloud \u00fcber das SDK nach der ben\u00f6tigten Ressource und deren Umwandlung in Felder f\u00fcr Terraform. Der Versuch starb sofort an der Sicherheitsgruppe, weil mir nicht gefiel, dass ich 1,5 Tage ben\u00f6tigte, nur um die Sicherheitsgruppe zu konvertieren (es gibt viele Ressourcen). Es dauert lange und sp\u00e4ter k\u00f6nnten sich die Felder \u00e4ndern\/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 die tfstate in tf konvertieren. Alle Daten sind dort vorhanden und die Felder sind die gleichen. Wie bekommt man einen vollst\u00e4ndigen tfstate f\u00fcr viele Ressourcen?? Hier kommt der Befehl `terraform refresh` ins Spiel. Terraform nimmt alle Ressourcen im tfstate und zieht anhand der ID die Daten ab und schreibt alles in den tfstate. Das bedeutet, man erstellt einen leeren tfstate nur mit Namen und ID, startet `terraform refresh` und erh\u00e4lt vollst\u00e4ndige tfstates. Hurra!<br \/>\nJetzt k\u00fcmmern wir uns um die rekursive Herausforderung, einen Konverter f\u00fcr tfstate in tf zu schreiben. F\u00fcr diejenigen, die tfstate noch nie gelesen haben: Das ist JSON, aber etwas speziell. <br \/>\nHier ist der wichtige Teil 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 \u2013 string<br \/>\n2. metadata \u2013 Array der Gr\u00f6\u00dfe 1, darin ein Objekt mit den unten beschriebenen Feldern<br \/>\n3. spec \u2013 Hash der Gr\u00f6\u00dfe 1, darin Key, Value<br \/>\nKurz gesagt, ein lustiges Format, alles kann auch mehrere Ebenen tief sein.<\/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>\nIm Grunde genommen, wer eine Programmieraufgabe f\u00fcr ein Vorstellungsgespr\u00e4ch m\u00f6chte, der kann einfach darum bitten, einen Parser daf\u00fcr zu schreiben \ud83d\ude42<br \/>\nNach vielen Versuchen, einen fehlerfreien Parser zu schreiben, fand ich einen Teil davon im Terraform-Code, und zwar den wichtigsten Teil. Und alles schien normal zu funktionieren.<\/p>\n<p>Versuch drei<br \/>\nEin Terraform-Provider ist eine Bin\u00e4rdatei, die Code mit allen Ressourcen und der Logik zur Arbeit mit Cloud-APIs enth\u00e4lt. Jede Cloud hat ihren eigenen Provider, und Terraform ruft sie \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 sch\u00f6n dargestellt und erm\u00f6glicht es, Terraform-Provider auf neuere Versionen zu wechseln und neue Funktionen zu erhalten, ohne den Code zu \u00e4ndern. Es stellte sich auch heraus, dass nicht alle Felder im tfstate im tf enthalten sein m\u00fcssen, und wie erf\u00e4hrt man das? Nur indem man den Provider danach fragt. Danach begann eine weitere \u00e4rgerliche Rekursion beim Zusammenstellen von regul\u00e4ren Ausdr\u00fccken und dem Suchen von Feldern innerhalb des tfstate in alle Ebenen nach innen.<\/p>\n<p>Am Ende entstand ein n\u00fctzliches CLI-Tool, dessen Infrastruktur f\u00fcr alle Terraform-Provider gemein ist und man kann leicht neue hinzuf\u00fcgen. Auch die Hinzuf\u00fcgung von Ressourcen erfordert wenig Code. Au\u00dferdem gibt es allerlei zus\u00e4tzliche Funktionen wie Verbindungen zwischen Ressourcen. Nat\u00fcrlich gab es viele verschiedene Probleme, die man nicht alle beschreiben kann.<br \/>\nIch nannte das Tool Terrafomer. <\/p>\n<h3>Finale<\/h3>\n<p>\nMit Terrafomer haben wir 500-700 Tausend Zeilen Code tf + tfstate in zwei Clouds generiert. Wir konnten Legacy-Dinge \u00fcbernehmen und sie nur \u00fcber Terraform angehen, wie es die besten Ideen der Infrastruktur als Code vorschlagen. Es ist einfach Magie, wenn man eine riesige Cloud nimmt und sie \u00fcber das Kommando in Form von funktionierenden Terraform-Dateien erh\u00e4lt. Und dann grep\/replace\/git und so weiter.<\/p>\n<p>Ich habe alles durchforstet und in Ordnung gebracht, die Genehmigungen eingeholt. Am Donnerstag (02.05.19) 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, 2 Pull-Requests zur Unterst\u00fctzung von OpenStack und Kubernetes erhalten. Gute R\u00fcckmeldungen. Das Projekt ist im Allgemeinen n\u00fctzlich f\u00fcr die Menschen.<br \/>\nIch empfehle es jedem, der mit Terraform anfangen m\u00f6chte und nicht alles daf\u00fcr neu schreiben will. <br \/>\nIch freue mich \u00fcber Pull-Requests, Issues, Sterne.<\/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 5.0.1.1 - 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.\" \/>\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) 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\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.\" \/>\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 \u00fcber das neue CLI-Tool sprechen, das ich geschrieben habe.","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.","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","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\/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}]}}