{"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\/da\/blog\/administrirovanie\/terraformer-infrastructure-to-code","title":{"rendered":"Terraformer \u2014 Infrastruktur til kode","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Terraformer \u2014 Infrastruktur til kode\" src=\"\/wp-content\/uploads\/2019\/05\/d97414f6b4608dbb4ec7f582b7001773.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJeg vil gerne fort\u00e6lle om et nyt CLI-v\u00e6rkt\u00f8j, jeg har skrevet for at l\u00f8se et gammelt problem. <\/p>\n<h3>Problemet<\/h3>\n<p>\nTerraform er l\u00e6nge blevet standarden i DevOps\/Cloud\/IT f\u00e6llesskabet. Det er en meget praktisk og nyttig ting til at arbejde med infrastruktur som kode. Der er mange fordele ved Terraform, s\u00e5vel som mange forhindringer, skarpe knive og f\u00e6lder. <br \/>\nMed Terraform er det meget nemt at lave nye ting og derefter administrere, \u00e6ndre eller slette dem. Men hvad skal man g\u00f8re, hvis man har en enorm infrastruktur i skyen, der ikke er oprettet via Terraform? At omskrive og genskabe hele skyen f\u00f8les b\u00e5de dyrt og usikkert. <br \/>\nJeg har v\u00e6ret ude for dette problem p\u00e5 to arbejdspladser, den mest enkle situation er, n\u00e5r man \u00f8nsker, at alt skal v\u00e6re i Git som Terraform-filer, men man har 250+ buckets, og at skrive dem til Terraform manuelt virker bare som for meget. <br \/>\nDer er <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/hashicorp\/terraform\/issues\/581\">issue<\/a><\/noindex> Siden 2014 har der v\u00e6ret et v\u00e6rkt\u00f8j som Terraform, der blev lukket i 2016, med h\u00e5bet om, at importfunktionaliteten ville blive tilf\u00f8jet.<\/p>\n<p>Generelt ser alt ud som p\u00e5 billedet, men fra h\u00f8jre mod venstre.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Advarsel: Forfatteren har ikke boet i Rusland i halvdelen af sit liv og skriver sj\u00e6ldent p\u00e5 russisk. V\u00e6r forsigtig med stavefejl.<\/p>\n<h3>L\u00f8sninger<\/h3>\n<p>\n1. Der findes gamle og f\u00e6rdige l\u00f8sninger til AWS. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dtan4\/terraforming\">terraforming<\/a><\/noindex>. Da jeg fors\u00f8gte at bruge det til at hente mine 250+ buckets, inds\u00e5 jeg, at der var mange problemer. AWS har l\u00e6nge tilf\u00f8jet mange nye muligheder, som terraforming ikke kender til, og det er generelt baseret p\u00e5 Ruby. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dtan4\/terraforming\/blob\/master\/lib\/terraforming\/template\/tf\/s3.erb\">Templates ser kedelige ud.<\/a><\/noindex>. Efter kl. 2 sendte jeg <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dtan4\/terraforming\/pull\/396\">Pull request<\/a><\/noindex> for at tilf\u00f8je flere funktioner der, og jeg inds\u00e5, at en s\u00e5dan l\u00f8sning ikke fungerer overhovedet. <br \/>\nHvordan fungerer terraforming? Det henter data fra AWS SDK og genererer tf og tfstate gennem en template. <br \/>\nHer er tre problemer:<br \/>\n1. Der vil altid v\u00e6re forsinkelse i opdateringerne.<br \/>\n2. tf-filerne bliver nogle gange beskadigede. <br \/>\n3. tfstate genereres separat fra tf og stemmer ikke altid overens.<br \/>\nDet er generelt sv\u00e6rt at f\u00e5 et resultat, hvor `terraform plan` siger, at der ikke er nogen \u00e6ndringer.<\/p>\n<p>2. `terraform import` \u2014 en indbygget kommando i Terraform. Hvordan fungerer det? <br \/>\nDu skriver en tom TF-fil med navnet og arten af ressourcen, derefter k\u00f8rer du `terraform import` og sender ressourcens ID. Terraform kommunikerer med udbyderen, f\u00e5r data og opretter en tfstate-fil. <br \/>\nHer er tre problemer:<br \/>\n1. Du f\u00e5r kun tfstate-filen, og tf er tom, s\u00e5 den skal skrives manuelt eller konverteres fra tfstate.<br \/>\n2. Det kan kun arbejde med \u00e9n ressource ad gangen og underst\u00f8tter ikke alle ressourcer. Hvad skal jeg s\u00e5 g\u00f8re med 250+ buckets?<br \/>\n3. Du skal kende ressourcens ID \u2014 det vil sige, at du skal indpakke det i kode, der henter ressourcelisten.<br \/>\nGenerelt er resultatet delvist og skalerer ikke godt.<\/p>\n<h3>Min l\u00f8sning.<br \/>\n<\/h3>\n<p>Krav:<br \/>\n1. Mulighed for at oprette tf- og tfstate-filer baseret p\u00e5 ressourcer. For eksempel at downloade alle buckets\/security group\/load balancer og hvad `terraform plan` returnerede om, at der ikke er \u00e6ndringer.<br \/>\n2. To skyer GCP + AWS<br \/>\n3. En global l\u00f8sning, der nemt kan opdateres hver gang, uden at bruge tid p\u00e5 hver ressource i tre dage.<br \/>\n4. G\u00f8re det Open source \u2014 alle har det samme problem.<\/p>\n<p>Programmeringssproget Go \u2014 derfor elsker jeg det, og der findes et bibliotek til oprettelse af HCL-filer, som bruges i terraform + en masse kode i terraform, der kan v\u00e6re nyttig.<\/p>\n<h3>Sti<\/h3>\n<p>\nF\u00f8rste fors\u00f8g<br \/>\nJeg startede med en simpel version. Adgang til skyen gennem SDK for at hente den n\u00f8dvendige ressource og konvertere den til felter til terraform. Fors\u00f8get d\u00f8de straks p\u00e5 security group, fordi jeg ikke kunne lide at bruge 1,5 dag p\u00e5 kun at konvertere security group (for der er mange ressourcer). Det er for lang tid, og derefter kan felterne \u00e6ndre sig eller tilf\u00f8jes.<\/p>\n<p>Andet fors\u00f8g<br \/>\nBaseret p\u00e5 ideen beskrevet <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/hashicorp\/terraform\/issues\/15608\">her<\/a><\/noindex>. Bare tage og konvertere tfstate til tf. Alle data er der, og felterne er de samme. Hvordan f\u00e5r man fuld tfstate for mange ressourcer? Her kom kommandoen `terraform refresh` til hj\u00e6lp. Terraform tager alle ressourcer i tfstate og henter data ved at bruge ID og skriver alt tilbage i tfstate. S\u00e5dan kan man oprette en tom tfstate kun med navne og ID, k\u00f8re `terraform refresh`, og s\u00e5 f\u00e5r vi komplette tfstate. Hurra!<br \/>\nLad os nu arbejde med den rekursive pornostof: skrive en converter for tfstate til tf. For dem, der aldrig har l\u00e6st tfstate, er det JSON, men s\u00e6rligt. <br \/>\nHer er dens vigtige del 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>\nHer har vi:<br \/>\n1. id \u2014 string<br \/>\n2. metadata \u2014 array p\u00e5 st\u00f8rrelse 1, indeholdende et objekt med felterne beskrevet nedenfor<br \/>\n3. spec \u2014 hash p\u00e5 st\u00f8rrelse 1, indeholdende key,value<br \/>\nKort sagt, en sjov format, alt kan ogs\u00e5 v\u00e6re dybt ind i flere niveauer.<\/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>\nGenerelt, hvis nogen \u00f8nsker en programmeringsopgave til et interview, s\u00e5 sp\u00f8rg bare om at skrive en parser til dette \ud83d\ude42<br \/>\nEfter mange fors\u00f8g p\u00e5 at skrive en parser uden fejl, fandt jeg en del af den i terraform-koden, nemlig den mest essentielle del. Og alt fungerede tilsyneladende fint.<\/p>\n<p>Fors\u00f8g tre<br \/>\nTerraform provider er bin\u00e6re filer, der indeholder kode med alle ressourcer og logik til at arbejde med cloud-API'er. Hver cloud har sin egen provider, og terraform kalder dem bare gennem sin RPC-protokol mellem to processer.<br \/>\nNu besluttede jeg at interagere direkte med terraform providers gennem RPC-kald. Det viste sig at v\u00e6re p\u00e6nt og gav mig mulighed for at opgradere terraform providers til nyere versioner og f\u00e5 nye funktioner uden at \u00e6ndre koden. Det viste sig ogs\u00e5, at ikke alle felter i tfstate beh\u00f8ver at v\u00e6re i tf, men hvordan finder man det ud? Man m\u00e5 sp\u00f8rge provider om det. S\u00e5 begyndte endnu en rekursiv proces med at samle regul\u00e6re udtryk til at finde felter inde i tfstate p\u00e5 alle niveauer.<\/p>\n<p>I slutningen endte jeg med et nyttigt CLI-v\u00e6rkt\u00f8j, som har en f\u00e6lles infrastruktur for alle terraform providers, og det er let at tilf\u00f8je nye. Desuden kr\u00e6ver tilf\u00f8jelsen af ressourcer lidt kode. Plus forskellige funktioner som forbindelser mellem ressourcer. Der var selvf\u00f8lgelig mange forskellige problemer, som ikke kan beskrives alle sammen.<br \/>\nJeg kaldte skabningen Terrafomer. <\/p>\n<h3>Finale<\/h3>\n<p>\nVi har genereret 500\u2013700.000 linjer tf + tfstate kode med Terraform i to forskellige skyder. Vi kunne tage legacy-ting og begynde at \u00e6ndre dem ned gennem Terraform, som i bedste praksis for infrastruktur som kode. Det er ren magi, n\u00e5r man tager en stor sky og f\u00e5r den i form af Terraform-filer via en kommando. Derefter grep\/replace\/git og s\u00e5 videre.<\/p>\n<p>Jeg har renset og systematiseret det, og f\u00e5et tilladelser. Udgivet p\u00e5 GitHub til alle torsdag (02.05.19). <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/GoogleCloudPlatform\/terraformer\">github.com\/GoogleCloudPlatform\/terraformer<\/a><\/noindex><br \/>\nJeg har allerede f\u00e5et 600 stjerner, 2 pull requests for at tilf\u00f8je support til OpenStack og Kubernetes. Gode anmeldelser. Generelt et nyttigt projekt for folk.<br \/>\nJeg anbefaler det til alle, der \u00f8nsker at begynde at arbejde med Terraform og ikke vil omskrive alt for dette. <br \/>\nJeg ser frem til pull requests, issues, stjerner.<\/p>\n<p>Demo<br \/>\n<noindex><img decoding=\"async\" alt=\"Terraformer \u2014 Infrastruktur til kode\" src=\"\/wp-content\/uploads\/2019\/05\/76f10055b9106590f72c4e22e4d4e6d5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/noindex><br \/>\n<br \/>Kilde: <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.3 - 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\/da\/blog\/administrirovanie\/terraformer-infrastructure-to-code\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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 Infrastruktur til kode | ProHoster","description":"Jeg vil gerne fort\u00e6lle om det nye CLI-v\u00e6rkt\u00f8j, som jeg har skrevet.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/terraformer-infrastructure-to-code","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/33123","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=33123"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/33123\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/24869"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=33123"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=33123"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=33123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}