{"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\/sq\/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 \/>\nD\u00ebshiroj t\u00eb flas p\u00ebr nj\u00eb mjet CLI t\u00eb ri q\u00eb kam shkruar p\u00ebr t\u00eb zgjidhur nj\u00eb problem t\u00eb vjet\u00ebr. <\/p>\n<h3>Problemi<\/h3>\n<p>\nTerraform ka koh\u00eb q\u00eb \u00ebsht\u00eb b\u00ebr\u00eb standard n\u00eb komunitetet DevOps\/Cloud\/IT. Nj\u00eb gj\u00eb shum\u00eb e p\u00ebrshtatshme dhe e dobishme p\u00ebr t\u00eb punuar me infrastructure as code. Ka shum\u00eb p\u00ebrmir\u00ebsime n\u00eb Terraform, por gjithashtu shum\u00eb pirgje, thika t\u00eb mprehta dhe gryk\u00ebra. <br \/>\nMe Terraform \u00ebsht\u00eb shum\u00eb e leht\u00eb t\u00eb krijosh gj\u00ebra t\u00eb reja dhe pastaj t'i menaxhosh, t\u00eb ndryshosh ose t\u00eb fshish. Por \u00e7far\u00eb t\u00eb b\u00ebjn\u00eb ata q\u00eb kan\u00eb nj\u00eb infrastruktur\u00eb t\u00eb madhe n\u00eb cloud dhe nuk \u00ebsht\u00eb krijuar p\u00ebrmes Terraform? T\u00eb ricopatosh dhe rikrijosh t\u00eb gjith\u00eb cloud-in \u00ebsht\u00eb disi e shtrenjt\u00eb dhe e pasigurt. <br \/>\nKam p\u00ebrballur nj\u00eb problem t\u00eb till\u00eb n\u00eb dy vende pune, nj\u00eb shembull shum\u00eb i thjesht\u00eb \u00ebsht\u00eb kur d\u00ebshiron q\u00eb gjith\u00e7ka t\u00eb jet\u00eb n\u00eb git n\u00eb form\u00ebn e skedave terraform, dhe ti ke 250+ kontejner\u00eb, dhe t'i shkruash p\u00ebr Terraform me duar \u00ebsht\u00eb shum\u00eb. <br \/>\nKa <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/hashicorp\/terraform\/issues\/581\">issue<\/a><\/noindex> q\u00eb nga viti 2014 me terrafom q\u00eb u mbyll n\u00eb 2016 me shpres\u00ebn q\u00eb do t\u00eb kishte import.<\/p>\n<p>N\u00eb p\u00ebrgjith\u00ebsi, gjith\u00e7ka \u00ebsht\u00eb si n\u00eb figur\u00eb, vet\u00ebm nga e djathta n\u00eb t\u00eb majt\u00eb.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Kujdes: Autori ka jetuar gjysm\u00ebn e jet\u00ebs jasht\u00eb Rusis\u00eb dhe shkruan pak n\u00eb rusisht. Kujdes p\u00ebr gabime n\u00eb ortografi.<\/p>\n<h3>Zgjidhjet<\/h3>\n<p>\n1. Ekzistojn\u00eb zgjidhje t\u00eb gatshme dhe t\u00eb vjetra p\u00ebr AWS. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dtan4\/terraforming\">terraforming<\/a><\/noindex>. Kur p\u00ebrpiqesha p\u00ebrmes tij p\u00ebr t\u00eb marr\u00eb 250+ kontejner\u00ebt e mi, kuptova se gjith\u00e7ka ishte keq. AWS ka shtuar shum\u00eb opsione t\u00eb reja dhe terraforming nuk i njeh ato dhe p\u00ebr m\u00eb tep\u00ebr ka ruby. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dtan4\/terraforming\/blob\/master\/lib\/terraforming\/template\/tf\/s3.erb\">templatet duket se jan\u00eb t\u00eb varf\u00ebra.<\/a><\/noindex>. Pas dy or\u00ebve, d\u00ebrgova <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dtan4\/terraforming\/pull\/396\">Pull request<\/a><\/noindex> p\u00ebr t\u00eb shtuar m\u00eb shum\u00eb mund\u00ebsi aty dhe kuptova se nj\u00eb zgjidhje e till\u00eb nuk p\u00ebrshtatet fare. <br \/>\nSi punon terraforming, ai merr t\u00eb dh\u00ebnat nga SDK AWS dhe gjeneron tf dhe tfstate p\u00ebrmes template. <br \/>\nK\u00ebtu ka 3 probleme:<br \/>\n1. Gjithmon\u00eb do t\u00eb ket\u00eb vones\u00eb n\u00eb p\u00ebrdit\u00ebsime.<br \/>\n2. Skedar\u00ebt tf ndonj\u00ebher\u00eb dalin t\u00eb prishur. <br \/>\n3. tfstate nd\u00ebrtohet ndar\u00eb nga tf dhe nuk p\u00ebrputhet gjithmon\u00eb.<br \/>\nN\u00eb p\u00ebrgjith\u00ebsi, \u00ebsht\u00eb e v\u00ebshtir\u00eb t\u00eb marr\u00ebsh nj\u00eb rezultat p\u00ebr t\u00eb cilin `terraform plan` do t\u00eb thot\u00eb q\u00eb nuk ka ndryshime.<\/p>\n<p>2. `terraform import` \u2014 nj\u00eb komand\u00eb e integruar n\u00eb terraform. Si funksionon? <br \/>\nShkruan nj\u00eb skedar bosh TF me emrin dhe pamjen e burimit, pastaj e ekzekuton `terraform import` dhe d\u00ebrgon ID-n\u00eb e burimit. terraform i drejtohet ofruesit, merr t\u00eb dh\u00ebna dhe krijon skedarin tfstate. <br \/>\nK\u00ebtu ka 3 probleme:<br \/>\n1. Merr vet\u00ebm skedarin tfstate, nd\u00ebrsa tf \u00ebsht\u00eb bosh dhe duhet ta shkruash me duar ose ta konvertosh nga tfstate.<br \/>\n2. Funksionon vet\u00ebm me nj\u00eb burim n\u00eb \u00e7do her\u00eb dhe nuk mb\u00ebshtet t\u00eb gjith\u00eb burimet. Dhe \u00e7far\u00eb t\u00eb b\u00ebj p\u00ebrs\u00ebri me 250+ kontejner\u00ebt.<br \/>\n3. Duhet t\u00eb dish ID e burimeve \u2014 pra, duhet ta mb\u00ebshtjell\u00ebsh n\u00eb kod q\u00eb merr list\u00ebn e burimeve.<br \/>\nN\u00eb p\u00ebrgjith\u00ebsi, rezultati \u00ebsht\u00eb pjesor dhe nuk shkall\u00ebzohet mir\u00eb.<\/p>\n<h3>Zgjidhja ime<br \/>\n<\/h3>\n<p>K\u00ebrkesat:<br \/>\n1. Mund\u00ebsi p\u00ebr t\u00eb krijuar skedar\u00eb tf dhe tfstate p\u00ebr resurset. P\u00ebr shembull, shkarkoni t\u00eb gjitha bucket-at \/ grupet e siguris\u00eb \/ balancuesin e ngarkes\u00ebs dhe q\u00eb `terraform plan` t\u00eb tregoj\u00eb se nuk ka ndryshime<br \/>\n2. Duhet 2 resurse Cloud GCP + AWS<br \/>\n3. Zgjidhje globale q\u00eb leht\u00eb p\u00ebrdit\u00ebsohet \u00e7do her\u00eb dhe nuk humb koh\u00eb p\u00ebr \u00e7do resurset 3 dit\u00eb pune<br \/>\n4. T\u00eb b\u00ebhet Open source \u2014 problemi \u00ebsht\u00eb t\u00eb gjith\u00eb t\u00eb till\u00eb<\/p>\n<p>Gjuha Go \u2014 prandaj un\u00eb e dua dhe ka nj\u00eb bibliotek\u00eb p\u00ebr krijimin e skedar\u00ebve HCL q\u00eb p\u00ebrdoret n\u00eb terraform + shum\u00eb kod n\u00eb terraform q\u00eb mund t\u00eb jet\u00eb i dobish\u00ebm<\/p>\n<h3>Rruga<\/h3>\n<p>\nP\u00ebrpjekja e par\u00eb<br \/>\nFillova me nj\u00eb variant t\u00eb thjesht\u00eb. Thirrje n\u00eb cloud p\u00ebrmes SDK p\u00ebr resurset e nevojshme dhe konvertimi i saj n\u00eb fushat p\u00ebr terraform. P\u00ebrpjekja vdiq menj\u00ebher\u00eb n\u00eb grupin e siguris\u00eb sepse nuk m\u00eb p\u00eblqeu t\u00eb kaloj 1.5 dit\u00eb duke konvertuar vet\u00ebm grupin e siguris\u00eb (pasi ka shum\u00eb resurse). E gjat\u00eb dhe pastaj fushat mund t\u00eb ndryshojn\u00eb \/ shtohen<\/p>\n<p>P\u00ebrpjekja e dyt\u00eb<br \/>\nE bazuar n\u00eb iden\u00eb e p\u00ebrshkruar <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/hashicorp\/terraform\/issues\/15608\">k\u00ebtu<\/a><\/noindex>. Thjesht t\u00eb marrim dhe t\u00eb konvertojm\u00eb tfstate n\u00eb tf. T\u00eb gjitha t\u00eb dh\u00ebnat jan\u00eb aty dhe fushat jan\u00eb t\u00eb nj\u00ebjta. Si t\u00eb merrni nj\u00eb tfstate t\u00eb plot\u00eb p\u00ebr shum\u00eb resurse?? K\u00ebtu ndihmon komanda `terraform refresh`. terraform merr t\u00eb gjitha resurset n\u00eb tfstate dhe sipas ID-s\u00eb nxjerr t\u00eb dh\u00ebnat dhe i shkruan t\u00eb gjitha n\u00eb tfstate. Pra, krijoni nj\u00eb tfstate bosh vet\u00ebm me emrat dhe ID-n\u00eb, ekzekutoni `terraform refresh` dhe merrni tfstate t\u00eb plota. Ura!<br \/>\nTani do t\u00eb merremi me shkrimin e konvertor\u00ebve p\u00ebr tfstate n\u00eb tf. P\u00ebr ata q\u00eb kurr\u00eb nuk e kan\u00eb lexuar tfstate, kjo \u00ebsht\u00eb JSON, por e ve\u00e7ant\u00eb. <br \/>\nK\u00ebtu \u00ebsht\u00eb pjesa e tij e r\u00ebnd\u00ebsishme 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>\nK\u00ebtu ka:<br \/>\n1. id \u2014 varg<br \/>\n2. metadata \u2014 array me madh\u00ebsi 1 dhe n\u00eb t\u00eb nj\u00eb objekt me fushat e p\u00ebrshkruara m\u00eb posht\u00eb<br \/>\n3. spec \u2014 hash me madh\u00ebsi 1 dhe n\u00eb t\u00eb \u00e7el\u00ebse, vlera<br \/>\nShkurt, nj\u00eb format arg\u00ebtues, gjith\u00e7ka mund t\u00eb jet\u00eb shum\u00eb nivelar po ashtu<\/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>\nN\u00eb p\u00ebrgjith\u00ebsi, kushdo q\u00eb d\u00ebshiron nj\u00eb problem p\u00ebr programim p\u00ebr intervista, thjesht k\u00ebrkohet t\u00eb shkruaj\u00eb nj\u00eb parser p\u00ebr k\u00ebt\u00eb \u00e7\u00ebshtje \ud83d\ude42<br \/>\nPas p\u00ebrpjekjesh t\u00eb shumta p\u00ebr t\u00eb shkruar nj\u00eb parser pa gabime, gjeta nj\u00eb pjes\u00eb t\u00eb tij n\u00eb kodin terraform, p\u00ebrkat\u00ebsisht pjes\u00ebn m\u00eb t\u00eb r\u00ebnd\u00ebsishme. Dhe gjith\u00e7ka dukej se punonte mir\u00eb.<\/p>\n<p>P\u00ebrpjekja e tret\u00eb<br \/>\nTerraform provider \u00ebsht\u00eb binar\u00ebt q\u00eb kan\u00eb kod me t\u00eb gjitha burimet dhe logjik\u00ebn p\u00ebr t\u00eb punuar me API-t\u00eb e cloudeve. \u00c7do cloud ka providerin e tij dhe terraform vet\u00ebm i th\u00ebrret ata p\u00ebrmes protokollit t\u00eb tij RPC midis dy proceseve.<br \/>\nTani vendosa t\u00eb drejtoj direkt tek terraform providers p\u00ebrmes thirrjeve RPC. K\u00ebshtu doli bukur dhe ofroi mund\u00ebsin\u00eb p\u00ebr t\u00eb ndryshuar terraform providers n\u00eb m\u00eb t\u00eb rinjt\u00eb dhe t\u00eb merrja mund\u00ebsi t\u00eb reja pa ndryshuar kodin. Po ashtu, doli se jo t\u00eb gjitha fushat n\u00eb tfstate duhet t\u00eb jen\u00eb n\u00eb tf, dhe si ta di k\u00ebt\u00eb? Vet\u00ebm duke i k\u00ebrkuar provider-it p\u00ebr k\u00ebt\u00eb. Pastaj filloi nj\u00eb tjet\u00ebr pornografi rekurzive me krijimin e shprehjeve t\u00eb rregullta p\u00ebr t\u00eb gjetur fushat brenda tfstate n\u00eb t\u00eb gjitha nivelet e thell\u00eb.<\/p>\n<p>N\u00eb fund doli nj\u00eb veg\u00ebl CLI e dobishme, e cila ka nj\u00eb infrastruktur\u00eb t\u00eb p\u00ebrbashk\u00ebt p\u00ebr t\u00eb gjith\u00eb terraform providers dhe \u00ebsht\u00eb e leht\u00eb p\u00ebr t\u00eb shtuar t\u00eb rinj. Po ashtu, shtimi i burimeve k\u00ebrkon pak kod. Plus, disa gj\u00ebra shtes\u00eb si lidhjet midis burimeve. Sigurisht q\u00eb pati shum\u00eb probleme t\u00eb ndryshme q\u00eb nuk mund t\u00eb p\u00ebrshkruhen t\u00eb gjitha.<br \/>\nE quajta krijes\u00ebn Terrafomer. <\/p>\n<h3>Finale<\/h3>\n<p>\nMe p\u00ebrdorimin e Terrafomer, gjeneruam 500-700 mij\u00eb rreshta kodi tf + tfstate nga dy nube. Arrit\u00ebm t\u00eb merrnim gj\u00ebra legjasi dhe t\u00eb fillonim t'i prekim ato vet\u00ebm p\u00ebrmes terraform si n\u00eb idet\u00eb m\u00eb t\u00eb mira t\u00eb infrastruktures si kod. Thjesht magji kur merr nj\u00eb nube t\u00eb madhe dhe e merr at\u00eb n\u00eb form\u00ebn e skedave terraform me nj\u00eb komand\u00eb. Pastaj grep\/replace\/git e k\u00ebshtu me radh\u00eb.<\/p>\n<p>E di\u00e7ka dhe e sistemova, mora lejet. E shpalla n\u00eb GitHub p\u00ebr t\u00eb gjith\u00eb t\u00eb enjten (02.05.19). <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/GoogleCloudPlatform\/terraformer\">github.com\/GoogleCloudPlatform\/terraformer<\/a><\/noindex><br \/>\nKam marr\u00eb tashm\u00eb 600 yje, 2 pull requests p\u00ebr shtimin e mb\u00ebshtetjes p\u00ebr openstack dhe kubernetes. Komentet jan\u00eb t\u00eb mira. P\u00ebrgjith\u00ebsisht, projekti \u00ebsht\u00eb i dobish\u00ebm p\u00ebr njer\u00ebzit.<br \/>\nJu rekomandoj t\u00eb gjith\u00eb ata q\u00eb d\u00ebshirojn\u00eb t\u00eb fillojn\u00eb t\u00eb punojn\u00eb me Terraform dhe t\u00eb mos e shkruajn\u00eb gjith\u00e7ka p\u00ebr k\u00ebt\u00eb. <br \/>\nDo t\u00eb isha i lumtur p\u00ebr pull requests, issues, stars.<\/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 \/>Burimi: <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 - 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\/sq\/blog\/administrirovanie\/terraformer-infrastructure-to-code\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\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\/sq\/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":"D\u00ebshiroja t\u00eb flisja p\u00ebr mjetin e ri CLI q\u00eb kam shkruar.","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/terraformer-infrastructure-to-code","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","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\/sq\/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\/sq\/wp-json\/wp\/v2\/posts\/33123","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=33123"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/33123\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/24869"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=33123"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=33123"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=33123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}