{"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\/ro\/blog\/administrirovanie\/terraformer-infrastructure-to-code","title":{"rendered":"Este disponibil\u0103 oficial lansarea sistemului deschis","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Este disponibil\u0103 oficial lansarea sistemului deschis\" src=\"\/wp-content\/uploads\/2019\/05\/d97414f6b4608dbb4ec7f582b7001773.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA\u0219 dori s\u0103 v\u0103 povestesc despre un nou tool CLI pe care l-am scris pentru a rezolva o problem\u0103 veche. <\/p>\n<h3>Problema<\/h3>\n<p>\nTerraform a devenit deja standard \u00een cadrul comunit\u0103\u021bii DevOps\/Cloud\/IT. Este un instrument foarte convenabil \u0219i util pentru a gestiona infrastructura ca \u0219i cod. Exist\u0103 multe beneficii \u00een Terraform, dar \u0219i multe capcane, cu\u021bite ascu\u021bite \u0219i obstacole. <br \/>\nCu Terraform este foarte eficient s\u0103 creezi lucruri noi \u0219i s\u0103 le gestionezi, s\u0103 le modifici sau s\u0103 le \u0219tergi. Dar ce fac cei care au o infrastructur\u0103 imens\u0103 \u00een cloud care nu a fost creat\u0103 prin Terraform? S\u0103 o rescrie \u0219i s\u0103 o recreeze ar fi destul de costisitor \u0219i nesigur. <br \/>\nAm \u00eent\u00e2mpinat o astfel de problem\u0103 la dou\u0103 locuri de munc\u0103, cel mai simplu exemplu fiind c\u00e2nd vrei ca totul s\u0103 fie \u00een git \u00een form\u0103 de fi\u0219iere Terraform, iar tu ai 250+ de bucket-uri iar a le scrie manual pentru Terraform ar fi foarte laborios. <br \/>\nExist\u0103 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/hashicorp\/terraform\/issues\/581\">issue<\/a><\/noindex> \u00cenc\u0103 din 2014 exista terraform care a fost \u00eenchis \u00een 2016 cu speran\u021ba c\u0103 va exista import.<\/p>\n<p>\u00cen general, totul este ca \u00een imagine, doar c\u0103 de la dreapta la st\u00e2nga.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Avertisment: Autorul tr\u0103ie\u0219te de o jum\u0103tate de via\u021b\u0103 \u00een afar\u0103 \u0219i scrie pu\u021bin \u00een limba rus\u0103. Aten\u021bie la gre\u0219elile de ortografie.<\/p>\n<h3>Solu\u021bii<\/h3>\n<p>\n1. Exist\u0103 solu\u021bii vechi \u0219i gata f\u0103cute pentru AWS. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dtan4\/terraforming\">terraforming<\/a><\/noindex>. C\u00e2nd am \u00eencercat s\u0103 ob\u021bin cele 250+ de bucket-uri prin intermediul acestuia, am realizat c\u0103 situa\u021bia este destul de trist\u0103. AWS a ad\u0103ugat deja multe op\u021biuni noi, dar terraforming nu le \u0219tie \u0219i \u00een plus folose\u0219te ruby. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dtan4\/terraforming\/blob\/master\/lib\/terraforming\/template\/tf\/s3.erb\">Templetele arat\u0103 destul de s\u0103r\u0103c\u0103cios.<\/a><\/noindex>. Dup\u0103 ora 2, am trimis <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dtan4\/terraforming\/pull\/396\">Pull request<\/a><\/noindex> pentru a ad\u0103uga mai multe func\u021bionalit\u0103\u021bi acolo \u0219i am realizat c\u0103 o astfel de solu\u021bie nu este deloc potrivit\u0103. <br \/>\nCum func\u021bioneaz\u0103 terraforming? Acesta ia date de la SDK-ul AWS \u0219i genereaz\u0103 fi\u0219iere tf \u0219i tfstate prin intermediul template-urilor. <br \/>\nSunt 3 probleme:<br \/>\n1. Va exista \u00eentotdeauna o \u00eent\u00e2rziere \u00een actualiz\u0103ri.<br \/>\n2. Fi\u0219ierele tf uneori sunt deteriorate. <br \/>\n3. fi\u0219ierul tfstate este generat separat de tf \u0219i nu corespund \u00eentotdeauna.<br \/>\n\u00cen general, este dificil s\u0103 ob\u021bii un rezultat \u00een care `terraform plan` s\u0103 spun\u0103 c\u0103 nu exist\u0103 modific\u0103ri.<\/p>\n<p>2. `terraform import` \u2014 este comanda \u00eencorporat\u0103 \u00een terraform. Cum func\u021bioneaz\u0103 aceasta? <br \/>\nScrii un fi\u0219ier TF gol cu numele \u0219i tipul resursei, apoi rulezi `terraform import` \u0219i \u00eei transmi\u021bi ID-ul resursei. Terraform se adreseaz\u0103 furnizorului, ob\u021bine datele \u0219i genereaz\u0103 fi\u0219ierul tfstate. <br \/>\nSunt 3 probleme:<br \/>\n1. Ob\u021binem doar fi\u0219ierul tfstate, iar tf este gol, trebuie s\u0103-l scriem manual sau s\u0103-l convertim din tfstate.<br \/>\n2. Poate lucra doar cu o singur\u0103 resurs\u0103 de fiecare dat\u0103 \u0219i nu accept\u0103 toate resursele. \u0218i ce ar trebui s\u0103 fac din nou cu cele 250+ bucket-uri?<br \/>\n3. Trebuie s\u0103 \u0219tii ID-urile resurselor \u2014 adic\u0103 trebuie s\u0103 \u00eel \u00eenf\u0103\u0219ori \u00een cod care extrage lista resurselor.<br \/>\n\u00cen general, rezultatul este par\u021bial \u0219i nu se scaleaz\u0103 bine.<\/p>\n<h3>Solu\u021bia mea<br \/>\n<\/h3>\n<p>Cerin\u021be:<br \/>\n1. Posibilitatea de a crea fi\u0219iere tf \u0219i tfstate pe baza resurselor. De exemplu, desc\u0103rcarea tuturor b\u0103rcilor \/ grupurilor de securitate \/ load balancer \u0219i ceea ce `terraform plan` a returnat c\u0103 nu sunt modific\u0103ri.<br \/>\n2. Necesare 2 cloud-uri GCP + AWS.<br \/>\n3. O solu\u021bie global\u0103 care s\u0103 fie u\u0219or de actualizat de fiecare dat\u0103 \u0219i s\u0103 nu pierzi timp cu fiecare resurs\u0103 timp de 3 zile de munc\u0103.<br \/>\n4. S\u0103 facem Open source \u2014 toat\u0103 lumea are aceea\u0219i problem\u0103.<\/p>\n<p>Limbajul Go \u2014 de aceea \u00eemi place, \u0219i exist\u0103 o bibliotec\u0103 pentru crearea fi\u0219ierelor HCL care este utilizat\u0103 \u00een terraform + multe coduri \u00een terraform care pot fi utile.<\/p>\n<h3>Calea<\/h3>\n<p>\n\u00cencercarea \u00eent\u00e2i<br \/>\nAm \u00eenceput cu o variant\u0103 simpl\u0103. Interac\u021biunea cu cloud-ul prin SDK pentru ob\u021binerea resursei necesare \u0219i conversia acesteia \u00een c\u00e2mpuri pentru terraform. \u00cencercarea a e\u0219uat imediat la grupul de securitate deoarece nu mi-a pl\u0103cut s\u0103 convertesc timp de 1.5 zile doar grupul de securitate (iar resursele sunt multe). E prea mult \u0219i apoi c\u00e2mpurile pot s\u0103 se schimbe \/ s\u0103 se adauge.<\/p>\n<p>\u00cencercarea a doua<br \/>\nSe bazeaz\u0103 pe ideea descris\u0103 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/hashicorp\/terraform\/issues\/15608\">aici<\/a><\/noindex>. Pur \u0219i simplu a lua \u0219i a converti tfstate \u00een tf. Toate datele sunt acolo \u0219i c\u00e2mpurile sunt acelea\u0219i. Cum ob\u021bii un tfstate complet pentru multe resurse?? Aici a intervenit comanda `terraform refresh`. terraform ia toate resursele din tfstate \u0219i, dup\u0103 ID, extrage datele despre ele \u0219i le scrie \u00een tfstate. Adic\u0103 s\u0103 creezi un tfstate gol doar cu numele \u0219i ID-urile, s\u0103 rulezi `terraform refresh` \u0219i ob\u021bii tfstate complete. Ura!<br \/>\nAcum s\u0103 ne ocup\u0103m de scrierea unui converter recursiv pentru tfstate \u00een tf. Pentru cei care nu au citit niciodat\u0103 tfstate, este JSON, dar special. <br \/>\nIat\u0103 partea sa important\u0103, 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>\nAici avem:<br \/>\n1. id \u2014 string<br \/>\n2. metadata \u2014 un array de dimensiune 1 \u0219i \u00een el un obiect cu c\u00e2mpurile descrise mai jos<br \/>\n3. spec \u2014 hash de dimensiune 1 \u0219i \u00een el key,value<br \/>\nPe scurt, un format interesant, totul poate fi la ad\u00e2ncimi \u0219i pe mai multe niveluri.<\/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>\n\u00cen general, cine vrea o provocare de programare pentru interviu, s\u0103 cear\u0103 pur \u0219i simplu scrierea unui parser pentru asta \ud83d\ude42<br \/>\nDup\u0103 \u00eencerc\u0103ri \u00eendelungate de a scrie un parser f\u0103r\u0103 erori, am g\u0103sit o parte din cod \u00een terraform, \u0219i anume partea cea mai important\u0103. \u0218i totul p\u0103rea s\u0103 func\u021bioneze bine.<\/p>\n<p>\u00cencercarea trei<br \/>\nProviderul terraform este un binar care con\u021bine cod cu toate resursele \u0219i logica pentru a lucra cu API-urile cloud. Fiecare cloud are propriul provider, iar terraform pur \u0219i simplu le cheam\u0103 prin protocolele sale RPC \u00eentre cele dou\u0103 procese.<br \/>\nAcum am decis s\u0103 m\u0103 adresez direct providerelor terraform prin apeluri RPC. A\u0219a a ie\u0219it frumos \u0219i mi-a dat posibilitatea de a schimba providerii terraform cu unele mai noi \u0219i de a ob\u021bine noi func\u021bionalit\u0103\u021bi f\u0103r\u0103 a schimba codul. De asemenea, s-a dovedit c\u0103 nu toate c\u00e2mpurile din tfstate trebuie s\u0103 fie \u00een tf, dar cum am aflat asta? Numai \u00eentreb\u00e2nd providerul despre asta. Apoi, a \u00eenceput o alt\u0103 pornografie recursiv\u0103 \u00een construirea expresiilor regulate cu c\u0103utarea c\u00e2mpurilor \u00een tfstate la toate nivelurile ad\u00e2nc.<\/p>\n<p>La final, a rezultat un instrument CLI util, care are o infrastructur\u0103 comun\u0103 pentru toate providerii terraform, fiind u\u0219or s\u0103 ad\u0103ugi un nou provider. De asemenea, ad\u0103ugarea resurselor necesit\u0103 pu\u021bin cod. Plus diverse avantaje, cum ar fi interconexiunile \u00eentre resurse. Desigur, au fost multe probleme diferite care nu pot fi toate descrise.<br \/>\nAm numit creatura Terrafomer. <\/p>\n<h3>Finala<\/h3>\n<p>\nAm generat \u00eentre 500-700 de mii de linii de cod tf + tfstate cu ajutorul Terrafomer \u00een dou\u0103 clouduri. Am reu\u0219it s\u0103 prelu\u0103m lucruri legate de legatur\u0103 \u0219i s\u0103 \u00eencepem s\u0103 le modific\u0103m doar prin terraform, a\u0219a cum este \u00een cele mai bune idei despre infrastructura ca cod. Este pur\u0103 magie c\u00e2nd iei un cloud uria\u0219 \u0219i \u00eel ob\u021bii printr-o comand\u0103 sub form\u0103 de fi\u0219iere terraform func\u021bionale. Iar apoi grep\/replace\/git \u0219i a\u0219a mai departe.<\/p>\n<p>Am calculat \u0219i am adus \u00een ordine, am ob\u021binut permisiunile. L-am lansat pe GitHub pentru to\u021bi joi (02.05.19). <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/GoogleCloudPlatform\/terraformer\">github.com\/GoogleCloudPlatform\/terraformer<\/a><\/noindex><br \/>\nAm ob\u021binut deja 600 de stele, 2 cereri de pull pentru ad\u0103ugarea suportului pentru openstack \u0219i kubernetes. Recenzii bune. \u00cen general, proiectul este util pentru oameni.<br \/>\n\u00cei recomand tuturor celor care doresc s\u0103 \u00eenceap\u0103 s\u0103 lucreze cu Terraform \u0219i s\u0103 nu rescrie totul pentru asta. <br \/>\nA\u0219 fi bucuros s\u0103 primesc cereri de pull, probleme, stele.<\/p>\n<p>Demo<br \/>\n<noindex><img decoding=\"async\" alt=\"Este disponibil\u0103 oficial lansarea sistemului deschis\" src=\"\/wp-content\/uploads\/2019\/05\/76f10055b9106590f72c4e22e4d4e6d5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/noindex><br \/>\n<br \/>Sursa: <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.2.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\/ro\/blog\/administrirovanie\/terraformer-infrastructure-to-code\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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 Infrastructur\u0103 Ca Cod | ProHoster","description":"A\u0219 dori s\u0103 v\u0103 vorbesc despre noul instrument CLI pe care l-am scris.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/terraformer-infrastructure-to-code","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/33123","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=33123"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/33123\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/24869"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=33123"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=33123"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=33123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}