{"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\/hu\/blog\/administrirovanie\/terraformer-infrastructure-to-code","title":{"rendered":"Terraformer \u2014 Infrastrukt\u00fara K\u00f3dba","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Terraformer \u2014 Infrastrukt\u00fara K\u00f3dba\" src=\"\/wp-content\/uploads\/2019\/05\/d97414f6b4608dbb4ec7f582b7001773.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSzeretn\u00e9k mes\u00e9lni egy \u00faj CLI eszk\u00f6zr\u0151l, amelyet \u00edrtam egy r\u00e9gi probl\u00e9ma megold\u00e1s\u00e1ra. <\/p>\n<h3>Probl\u00e9ma<\/h3>\n<p>\nA Terraform m\u00e1r r\u00e9g\u00f3ta standard a DevOps \/ Cloud \/ IT k\u00f6z\u00f6ss\u00e9gben. Nagyon k\u00e9nyelmes \u00e9s hasznos az infrastrukt\u00fara k\u00f3d form\u00e1j\u00e1ban val\u00f3 kezel\u00e9s\u00e9re. Sok sz\u00e9ps\u00e9ge van a Terraformnak, de sok villa, \u00e9les k\u00e9s \u00e9s csapda is. <br \/>\nA Terraformmal nagyon k\u00e9nyelmes \u00faj dolgokat l\u00e9trehozni, majd ezeket kezelni, m\u00f3dos\u00edtani vagy t\u00f6r\u00f6lni. De mi a helyzet azokkal, akiknek hatalmas felh\u0151infrastrukt\u00far\u00e1juk van, \u00e9s nem Terraformon kereszt\u00fcl k\u00e9sz\u00fclt? Az eg\u00e9sz felh\u0151 \u00fajra\u00edr\u00e1sa \u00e9s \u00fajrarendel\u00e9se el\u00e9g dr\u00e1ga \u00e9s nem biztons\u00e1gos. <br \/>\nK\u00e9t munkahelyen tal\u00e1lkoztam ilyen probl\u00e9m\u00e1val. A legegyszer\u0171bb p\u00e9lda, amikor szeretn\u00e9m, hogy minden a Gitben terrafom f\u00e1jlok form\u00e1j\u00e1ban legyen, de van 250+ t\u00e1rol\u00f3m, \u00e9s k\u00e9zzel meg\u00edrni \u0151ket a Terraformhoz t\u00fal sok. <br \/>\nVan <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/hashicorp\/terraform\/issues\/581\">issue<\/a><\/noindex> M\u00e1r 2014 \u00f3ta l\u00e9tezik a terrafom, amely 2016-ban z\u00e1rult be, rem\u00e9lve, hogy lesz import\u00e1l\u00e1s.<\/p>\n<p>Minden, mint a k\u00e9pen, csak jobbr\u00f3l balra.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Figyelmeztet\u00e9sek: A szerz\u0151 \u00e9lete fel\u00e9t nem Oroszorsz\u00e1gban t\u00f6lti \u00e9s csak keveset \u00edr oroszul. \u00d3vatosan az helyes\u00edr\u00e1si hib\u00e1kkal.<\/p>\n<h3>Megold\u00e1sok<\/h3>\n<p>\n1. L\u00e9teznek k\u00e9sz \u00e9s r\u00e9gi megold\u00e1sok az AWS-hez. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dtan4\/terraforming\">terraforming<\/a><\/noindex>. Amikor megpr\u00f3b\u00e1ltam vele megszerezni a 250+ t\u00e1rol\u00f3mat, akkor r\u00e1j\u00f6ttem, hogy nagyon rossz. Az AWS m\u00e1r r\u00e9g\u00f3ta sok \u00faj lehet\u0151s\u00e9get bevezetett, de a terraforming nem tud r\u00f3luk, \u00e9s egy\u00e9bk\u00e9nt is Ruby. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dtan4\/terraforming\/blob\/master\/lib\/terraforming\/template\/tf\/s3.erb\">A sablonok szeg\u00e9nyesen n\u00e9znek ki.<\/a><\/noindex>. K\u00e9t este ut\u00e1n elk\u00fcldtem. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dtan4\/terraforming\/pull\/396\">Pull request<\/a><\/noindex> hogy t\u00f6bb lehet\u0151s\u00e9get adjak hozz\u00e1, \u00e9s r\u00e1j\u00f6ttem, hogy az ilyen megold\u00e1s egy\u00e1ltal\u00e1n nem megfelel\u0151. <br \/>\nA terraforming \u00fagy m\u0171k\u00f6dik, hogy az AWS SDK-t\u00f3l beszerzi az adatokat, \u00e9s tf \u00e9s tfstate f\u00e1jlokat gener\u00e1l sablon alapj\u00e1n. <br \/>\nItt h\u00e1rom probl\u00e9ma van:<br \/>\n1. Mindig lesz k\u00e9s\u00e9s a friss\u00edt\u00e9sekben.<br \/>\n2. A tf f\u00e1jlok n\u00e9ha s\u00e9r\u00fcltek. <br \/>\n3. A tfstate k\u00fcl\u00f6n k\u00e9sz\u00fclt a tf-t\u0151l, \u00e9s nem mindig egyezik meg.<br \/>\n\u00c1ltal\u00e1ban neh\u00e9z el\u00e9rni, hogy a `terraform plan` azt mondja, hogy nincsenek v\u00e1ltoz\u00e1sok.<\/p>\n<p>2. `terraform import` \u2014 be\u00e9p\u00edtett parancs a terraformhoz. Hogyan m\u0171k\u00f6dik? <br \/>\n\u00cdrsz egy \u00fcres TF f\u00e1jlt az er\u0151forr\u00e1s nev\u00e9vel \u00e9s t\u00edpus\u00e1val, majd elind\u00edtod a `terraform import`-t, \u00e9s \u00e1tadod az er\u0151forr\u00e1s ID-t. A terraform a szolg\u00e1ltat\u00f3hoz fordul, megkapja az adatokat, \u00e9s l\u00e9trehozza a tfstate f\u00e1jlt. <br \/>\nItt h\u00e1rom probl\u00e9ma van:<br \/>\n1. Csak a tfstate f\u00e1jl k\u00e9sz\u00fcl el, a tf \u00fcres, azt manu\u00e1lisan kell \u00edrni vagy a tfstate-b\u0151l konvert\u00e1lni.<br \/>\n2. Csak egy er\u0151forr\u00e1ssal tud dolgozni egyszerre, \u00e9s nem t\u00e1mogat minden er\u0151forr\u00e1st. \u00c9s mit csin\u00e1ljak \u00fajra a 250+ t\u00e1rol\u00f3mmal?<br \/>\n3. Ismerni kell az er\u0151forr\u00e1sok ID-j\u00e1t \u2014 teh\u00e1t be kell burkolni ezt egy k\u00f3dba, amely lek\u00e9rdezi az er\u0151forr\u00e1sok list\u00e1j\u00e1t.<br \/>\n\u00c1ltal\u00e1ban az eredm\u00e9ny r\u00e9szleges \u00e9s nem m\u00e9retezhet\u0151 j\u00f3l.<\/p>\n<h3>Az \u00e9n megold\u00e1som<br \/>\n<\/h3>\n<p>Elv\u00e1r\u00e1sok:<br \/>\n1. Lehet\u0151s\u00e9g tf \u00e9s tfstate f\u00e1jlokat l\u00e9trehozni er\u0151forr\u00e1sok alapj\u00e1n. P\u00e9ld\u00e1ul let\u00f6lteni az \u00f6sszes t\u00e1rol\u00f3t\/security csoportot\/terhel\u00e9seloszt\u00f3t, \u00e9s hogy a `terraform plan` azt adja vissza, hogy nincs v\u00e1ltoz\u00e1s.<br \/>\n2. Kell 2 felh\u0151: GCP + AWS.<br \/>\n3. Glob\u00e1lis megold\u00e1s, amelyet k\u00f6nnyen friss\u00edteni lehet, \u00e9s nem kell minden er\u0151forr\u00e1ssal napi 3 napot elt\u00f6lteni.<br \/>\n4. Ny\u00edlt forr\u00e1sk\u00f3d\u00fav\u00e1 tenni \u2014 ez mindenkinek probl\u00e9m\u00e1ja.<\/p>\n<p>Go nyelv \u2014 ez\u00e9rt szeretem, \u00e9s van egy k\u00f6nyvt\u00e1r benne HCL f\u00e1jlok l\u00e9trehoz\u00e1s\u00e1ra, amelyet a terraform haszn\u00e1l + sok k\u00f3d a terraform-ben, amely hasznos lehet.<\/p>\n<h3>\u00dat<\/h3>\n<p>\nEls\u0151 k\u00eds\u00e9rlet<br \/>\nEgyszer\u0171 v\u00e1ltozattal kezdtem. H\u00edv\u00e1sok a felh\u0151n kereszt\u00fcl az SDK-val a sz\u00fcks\u00e9ges er\u0151forr\u00e1shoz \u00e9s annak konvert\u00e1l\u00e1sa mez\u0151kk\u00e9 a terraform sz\u00e1m\u00e1ra. A k\u00eds\u00e9rlet azonnal elhalt a security csoportn\u00e1l, mert nem tetszett, hogy 1,5 napot t\u00f6lt\u00f6ttem el csak a security csoport konvert\u00e1l\u00e1s\u00e1val (mivel sok er\u0151forr\u00e1s van). Hossz\u00fa \u00e9s azut\u00e1n a mez\u0151k v\u00e1ltozhatnak\/hozz\u00e1adhat\u00f3k.<\/p>\n<p>M\u00e1sodik k\u00eds\u00e9rlet<br \/>\nAz \u00f6tlet alapj\u00e1n, amit le\u00edrtam, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/hashicorp\/terraform\/issues\/15608\">itt<\/a><\/noindex>. Egyszer\u0171en \u00e1t kell venni \u00e9s konvert\u00e1lni a tfstate-t tf-be. Minden adat ott van \u00e9s a mez\u0151k is ugyanazok. Hogyan lehet teljes tfstate-t kapni sok er\u0151forr\u00e1shoz?? Itt seg\u00edtett a `terraform refresh` parancs. A terraform az \u00f6sszes er\u0151forr\u00e1st veszi a tfstate-b\u0151l \u00e9s ID alapj\u00e1n kinyeri az adatokat, \u00e9s mindet \u00edrja a tfstate-be. Teh\u00e1t l\u00e9trehozni egy \u00fcres tfstate-t csak nevekkel \u00e9s ID-kkal, v\u00e9grehajtani a `terraform refresh`-t, \u00edgy megkapjuk a teljes tfstate-t. Hurr\u00e1!<br \/>\nMost foglalkozzunk a rekurt\u00edv pornogr\u00e1fi\u00e1val, a tfstate-t tf-re konvert\u00e1l\u00f3 \u00edr\u00e1s\u00e1val. Azok sz\u00e1m\u00e1ra, akik soha nem olvastak tfstate-t, ez JSON, de k\u00fcl\u00f6nleges. <br \/>\nItt az fontos r\u00e9szlete: 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>\nItt van:<br \/>\n1. id \u2014 string<br \/>\n2. metadata \u2014 1 m\u00e9ret\u0171 t\u00f6mb, amelyben az al\u00e1bbi mez\u0151kkel rendelkez\u0151 objektum tal\u00e1lhat\u00f3<br \/>\n3. spec \u2014 1 m\u00e9ret\u0171 hash, amelyben kulcs-\u00e9rt\u00e9k p\u00e1r van<br \/>\nR\u00f6viden, vid\u00e1m form\u00e1tum, minden m\u00e9lys\u00e9gbe mehet t\u00f6bb szinten is.<\/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\u00c1ltal\u00e1ban, aki programoz\u00e1si feladatot keres interj\u00fara, az csak k\u00e9rje meg, hogy \u00edrjon egy parser-t erre a dologra \ud83d\ude42<br \/>\nHossz\u00fa pr\u00f3b\u00e1lkoz\u00e1sok ut\u00e1n, hogy hib\u00e1k n\u00e9lk\u00fcli parser-t \u00edrjak, felfedeztem a terraform k\u00f3dj\u00e1ban a legfontosabb r\u00e9sz\u00e9t. \u00c9s \u00fagy t\u0171nik, minden rendben m\u0171k\u00f6d\u00f6tt.<\/p>\n<p>Harmadik k\u00eds\u00e9rlet<br \/>\nA terraform provider olyan bin\u00e1ris f\u00e1jlok, amelyek tartalmazz\u00e1k a k\u00f3dot az \u00f6sszes er\u0151forr\u00e1ssal \u00e9s logik\u00e1val az API-k felh\u0151kkel val\u00f3 haszn\u00e1lat\u00e1hoz. Minden felh\u0151nek megvan a saj\u00e1t providere, \u00e9s a terraform csak ezeket h\u00edvja meg az RPC protokollj\u00e1n kereszt\u00fcl k\u00e9t folyamat k\u00f6z\u00f6tt.<br \/>\nMost \u00fagy d\u00f6nt\u00f6ttem, k\u00f6zvetlen\u00fcl a terraform providerekkel fogok dolgozni RPC h\u00edv\u00e1sokon kereszt\u00fcl. Ez sz\u00e9pen alakult, \u00e9s lehet\u0151s\u00e9get adott arra, hogy friss\u00edtsem a terraform providereket an\u00e9lk\u00fcl, hogy m\u00f3dos\u00edtani kellene a k\u00f3dot. Kider\u00fclt, hogy nem minden mez\u0151nek kell benne lennie a tfstate-ben, de hogyan tudom ezt? Csak meg kell k\u00e9rdezni a providert err\u0151l. Azt\u00e1n egy \u00fajabb rekurz\u00edv \u201eporn\u00f3z\u00e1s\u201d kezd\u0151d\u00f6tt a regul\u00e1ris kifejez\u00e9sek \u00f6sszeszerel\u00e9s\u00e9vel a mez\u0151k keres\u00e9s\u00e9re a tfstate minden szintj\u00e9n bel\u00fcl.<\/p>\n<p>A v\u00e9g\u00e9n egy hasznos CLI eszk\u00f6zt k\u00e9sz\u00edtettem, amely k\u00f6z\u00f6s infrastrukt\u00far\u00e1val rendelkezik az \u00f6sszes terraform provider sz\u00e1m\u00e1ra, \u00e9s k\u00f6nnyen hozz\u00e1 lehet adni \u00fajat. Emellett az er\u0151forr\u00e1sok hozz\u00e1ad\u00e1sa kev\u00e9s k\u00f3dot ig\u00e9nyel. Plusz mindenf\u00e9le apr\u00f3s\u00e1g, mint az er\u0151forr\u00e1sok k\u00f6z\u00f6tti kapcsolatok. Term\u00e9szetesen sok k\u00fcl\u00f6nb\u00f6z\u0151 probl\u00e9ma mer\u00fclt fel, amelyeket mind nem lehet le\u00edrni.<br \/>\nTerrafomer-nek neveztem el a kis sz\u00f6rnyet. <\/p>\n<h3>D\u00f6nt\u0151<\/h3>\n<p>\nA Terrafomer seg\u00edts\u00e9g\u00e9vel 500-700 ezer sor tf + tfstate k\u00f3dot gener\u00e1ltunk k\u00e9t felh\u0151ben. K\u00e9pess\u00e9 v\u00e1ltunk r\u00e9gi dolgokat el\u0151venni \u00e9s csak terraform seg\u00edts\u00e9g\u00e9vel kezdhett\u00fcnk el foglalkozni vel\u00fck, ahogy a legjobb infrastructure as code \u00f6tletekben. Egyszer\u0171 var\u00e1zslat, amikor egy hatalmas felh\u0151t veszel, \u00e9s parancs seg\u00edts\u00e9g\u00e9vel terraform f\u00e1jlok form\u00e1j\u00e1ban kapod meg. Azt\u00e1n grep\/replace\/git \u00e9s \u00edgy tov\u00e1bb.<\/p>\n<p>Kisz\u00e1moltam \u00e9s rendbe raktam, megkaptam az enged\u00e9lyeket. Cs\u00fct\u00f6rt\u00f6k\u00f6n (2019.05.02.) kiadtam a GitHub-ra mindenki sz\u00e1m\u00e1ra. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/GoogleCloudPlatform\/terraformer\">github.com\/GoogleCloudPlatform\/terraformer<\/a><\/noindex><br \/>\nM\u00e1r 600 csillagot kaptam, 2 pull request, amelyek az openstack \u00e9s kubernetes t\u00e1mogat\u00e1s\u00e1t adj\u00e1k hozz\u00e1. J\u00f3 visszajelz\u00e9sek. A projekt igaz\u00e1n hasznos az emberek sz\u00e1m\u00e1ra.<br \/>\nAj\u00e1nlom mindenkinek, aki elkezdene dolgozni a Terraform-mal \u00e9s nem akar mindent \u00e1t\u00edrni emiatt. <br \/>\n\u00d6r\u00f6mmel fogadom a pull requesteket, a probl\u00e9m\u00e1kat \u00e9s a csillagokat.<\/p>\n<p>Demos<br \/>\n<noindex><img decoding=\"async\" alt=\"Terraformer \u2014 Infrastrukt\u00fara K\u00f3dba\" src=\"\/wp-content\/uploads\/2019\/05\/76f10055b9106590f72c4e22e4d4e6d5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/noindex><br \/>\n<br \/>Forr\u00e1s: <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\/hu\/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=\"hu_HU\" \/>\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\/hu\/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":"Szeretn\u00e9m bemutatni az \u00faj CLI eszk\u00f6zt, amit \u00edrtam.","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/terraformer-infrastructure-to-code","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","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\/hu\/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\/hu\/wp-json\/wp\/v2\/posts\/33123","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=33123"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/33123\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/24869"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=33123"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=33123"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=33123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}