{"id":98123,"date":"2020-10-24T14:42:52","date_gmt":"2020-10-24T12:42:52","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens"},"modified":"2020-11-18T00:58:49","modified_gmt":"2020-11-17T22:58:49","slug":"patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens","status":"publish","type":"post","link":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens","title":{"rendered":"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/ec13125c702f42863bbe774cd805442b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De parc\u0103 dezvoltatorii Terraform ofer\u0103 suficiente practici de top pentru a lucra cu infrastructura AWS. Doar c\u0103 exist\u0103 un meci. \u00cen timp, num\u0103rul de medii cre\u0219te, iar fiecare are particularit\u0103\u021bile sale. Apare aproape o copie a stack-ului de aplica\u021bii \u00een regiunea vecin\u0103. \u0218i codul Terraform trebuie copiat \u0219i modificat cu aten\u021bie \u00een conformitate cu noile cerin\u021be sau trebuie s\u0103 facem o \u201ez\u0103pad\u0103\u201d.<\/p>\n<p><\/p>\n<p>Prezentarea mea se refer\u0103 la modele \u00een Terraform pentru a combate haosul \u0219i rutina manual\u0103 \u00een proiecte mari \u0219i de lung\u0103 durat\u0103.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Video:<\/p>\n<p>\n<center><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/5f92845c017bf613f0899d88\" frameborder=\"0\" allowfullscreen><\/iframe><\/center><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/8c67c45e486d6c03793dd08c33a16313.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Am 40 de ani \u0219i am 20 de ani de experien\u021b\u0103 \u00een IT. Lucrez de 12 ani la compania Ixtens. Ne ocup\u0103m cu dezvoltarea bazat\u0103 pe ecommerce. Iar de 5 ani practic metodele DevOps.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/8b14b3adaa45d69278d76580baa99042.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Povestea mea va fi despre experien\u021ba \u00eentr-un proiect la o companie al c\u0103rei nume nu-l voi men\u021biona, protej\u00e2ndu-m\u0103 cu un acord de confiden\u021bialitate. <\/p>\n<p><\/p>\n<p>Numerele de pe slide sunt men\u021bionate pentru a \u00een\u021belege amploarea proiectului. \u0218i tot ceea ce voi spune mai departe este legat de Amazon.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/3742217a2abaf1fcf2163979d82eac14.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>M-am al\u0103turat acestui proiect acum 4 ani. \u0218i \u00een plin\u0103 desf\u0103\u0219urare era un refactoring al infrastructurii, pentru c\u0103 proiectul a crescut. Iar modelele utilizate nu mai erau potrivite. Av\u00e2nd \u00een vedere toat\u0103 cre\u0219terea planificat\u0103 a proiectului, era nevoie de ceva nou. <\/p>\n<p><\/p>\n<p>Mul\u021bumesc lui Matvey, care ieri a povestit ce s-a \u00eent\u00e2mplat la Dodo Pizza. Acesta este ceea ce ne-a avut loc acum 4 ani. <\/p>\n<p><\/p>\n<p>Dezvoltatorii au venit \u0219i au \u00eenceput s\u0103 creeze codul infrastructurii. <\/p>\n<p><\/p>\n<p>Cele mai evidente motive pentru care a fost necesar erau timpul de lansare pe pia\u021b\u0103. Trebuia s\u0103 facem astfel \u00eenc\u00e2t echipa DevOps s\u0103 nu fie un punct restric\u021bionat \u00een timpul implement\u0103rii. \u0218i pe l\u00e2ng\u0103 toate acestea, la nivelul cel mai de baz\u0103 s-au folosit Terraform \u0219i Puppet.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/13d6df6a324d2e1162acef77ca2ad0dc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Terraform este un proiect open source al companiei HashiCorp. \u0218i pentru cei care nu \u0219tiu ce este, urm\u0103toarele c\u00e2teva slide-uri. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/61726d4205d1f4f8e449fe9d71507508.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Infrastructura ca \u0219i cod \u00eenseamn\u0103 c\u0103 putem descrie infrastructura noastr\u0103 \u0219i putem cere unor robo\u021bi s\u0103 fac\u0103 \u00een a\u0219a fel \u00eenc\u00e2t s\u0103 ob\u021binem resursele pe care le-am descris.<\/p>\n<p><\/p>\n<p>De exemplu, avem nevoie de <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/ro\/vps\/abuzoustojchivye-vps\/\"   title=\"ma\u0219in\u0103 virtual\u0103\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"4196\">ma\u0219in\u0103 virtual\u0103<\/a>. O vom descrie, ad\u0103ug\u00e2nd c\u00e2teva parametrii obligatorii. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/eb52c1e458fa092bba8577fffceb864c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dup\u0103 aceea, \u00een consol\u0103 vom configura accesul la Amazon. \u0218i vom cere Terraform plan. Terraform plan ne va spune: \u201eOk, pentru resursa ta putem face urm\u0103toarele lucruri\u201d. \u0218i, cel pu\u021bin, o resurs\u0103 va fi ad\u0103ugat\u0103. \u0218i nu sunt prev\u0103zute modific\u0103ri. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/879e645596121ee5d05ac247b4be19ee.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dup\u0103 ce totul este \u00een regul\u0103, po\u021bi cere Terraform apply \u0219i Terraform \u00ee\u021bi va crea un instance, iar tu vei ob\u021bine o ma\u0219in\u0103 virtual\u0103 \u00een norul t\u0103u.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/77b7fe4d6abcc9116233f48caa887465.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Apoi, proiectul nostru se dezvolt\u0103. Ad\u0103ug\u0103m anumite modific\u0103ri. Cerem mai multe instan\u021be, ad\u0103ug\u0103m 53 de \u00eenregistr\u0103ri.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/98ce7e1f9d1f85aa5e78c269a0708ac1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i repet\u0103m. Cerem un plan. Vedem ce modific\u0103ri sunt planificate. Aplic\u0103m. Astfel, infrastructura noastr\u0103 cre\u0219te. <\/p>\n<p><\/p>\n<p>Terraform folose\u0219te a\u0219a-numitele fi\u0219iere state. Adic\u0103, toate modific\u0103rile care merg pe Amazon sunt p\u0103strate \u00eentr-un fi\u0219ier, unde pentru fiecare resurs\u0103 pe care a\u021bi descris-o, exist\u0103 resurse corespunz\u0103toare create \u00een Amazon. Astfel, atunci c\u00e2nd se schimb\u0103 descrierea unei resurse, Terraform \u0219tie exact ce trebuie s\u0103 schimbe \u00een Amazon.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/6e83efffb7af6ab967b4716be170b47b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aceste fi\u0219iere state erau ini\u021bial doar fi\u0219iere. Le p\u0103stram \u00een Git, ceea ce era extrem de incomod. Tot timpul cineva uita s\u0103 comit\u0103 modific\u0103rile \u0219i ap\u0103reau multe conflicte. <\/p>\n<p><\/p>\n<p>Acum exist\u0103 posibilitatea de a utiliza un back-end, adic\u0103 Terraform specific\u0103 \u00een ce bucket \u0219i cu ce cheie trebuie s\u0103 fie salvat fi\u0219ierul state. Iar Terraform se ocup\u0103 de ob\u021binerea acestui fi\u0219ier state, de a face toat\u0103 magia \u0219i de a returna rezultatul final.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/e6687463a9fe3cff979f44ac7778b4e8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Infrastructura noastr\u0103 cre\u0219te. Iat\u0103 codul nostru. \u0218i acum nu vrem doar s\u0103 cre\u0103m o ma\u0219in\u0103 virtual\u0103, vrem s\u0103 avem un mediu de testare.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/0effb09fa04d3d520c1cdbb34ce97810.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Terraform permite crearea unui modul, adic\u0103 s\u0103 descriem acela\u0219i lucru \u00eentr-un folder.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/95c8395b10142fe550b0719161211f15.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De exemplu, \u00een testare putem apela acest modul \u0219i ob\u021bine acela\u0219i rezultat ca \u0219i cum am rula Terraform apply \u00een modulul \u00eensu\u0219i. Pentru testare va fi un cod de acest tip.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/fa4c16e3835a4507a858d2ddb767daf3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pentru produc\u021bie putem trimite acolo anumite modific\u0103ri, deoarece \u00een testare nu avem nevoie de instan\u021be mari, dar \u00een produc\u021bie instan\u021bele mari sunt foarte utile.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/19478de23da2278567e66bacef78a0a9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i apoi m\u0103 voi \u00eentoarce \u00een proiect. A fost o sarcin\u0103 complex\u0103, infrastructura era planificat\u0103 s\u0103 fie foarte mare. \u0218i trebuia s\u0103 g\u0103sim o modalitate de a organiza tot codul astfel \u00eenc\u00e2t s\u0103 fie convenabil pentru to\u021bi: at\u00e2t pentru cei care \u00eentre\u021bin acest cod, c\u00e2t \u0219i pentru cei care fac modific\u0103ri. Era planificat ca orice dezvoltator s\u0103 poat\u0103 merge \u0219i s\u0103 ajusteze infrastructura a\u0219a cum este necesar pentru partea sa de platform\u0103. <\/p>\n<p><\/p>\n<p>Aceasta este o structur\u0103 de directoare recomandat\u0103 de HashiCorp, dac\u0103 ave\u021bi un proiect mare \u0219i are sens s\u0103 \u00eemp\u0103r\u021bi\u021bi \u00eentreaga infrastructur\u0103 \u00een buc\u0103\u021bi mai mici \u0219i s\u0103 descrie\u021bi fiecare bucat\u0103 \u00een folderul s\u0103u. <\/p>\n<p><\/p>\n<p>Av\u00e2nd o bibliotec\u0103 extins\u0103 de resurse, pute\u021bi apela cam aceea\u0219i ceva at\u00e2t \u00een testare c\u00e2t \u0219i \u00een produc\u021bie. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/c30cdc3d3ce5441bc0ae4a485069dacc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00cen cazul nostru, aceasta nu se potrivea foarte bine, deoarece era nevoie de un stack de testare pentru dezvoltatori sau pentru testare, care s\u0103 fie ob\u021binut \u00eentr-un mod mai simplu. Nu voiam s\u0103 navig\u0103m prin foldere \u0219i s\u0103 aplic\u0103m \u00een ordinea necesar\u0103, \u00eengrijor\u00e2ndu-ne c\u0103 baza de date se va ridica, iar apoi va ap\u0103rea un instance care utilizeaz\u0103 aceast\u0103 baz\u0103. A\u0219adar, tot testul era lansat dintr-un singur folder. Acolo erau invocate acelea\u0219i module, dar totul se desf\u0103\u0219ura \u00eentr-o singur\u0103 execu\u021bie.<\/p>\n<p><\/p>\n<p>Terraform se ocup\u0103 de toate dependen\u021bele. \u0218i \u00eentotdeauna creeaz\u0103 resurse \u00een ordinea \u00een care se poate ob\u021bine un IP, de exemplu, de la un instance nou creat \u0219i ob\u021bine acest IP \u00een \u00eenregistrarea route53. <\/p>\n<p><\/p>\n<p>Pe l\u00e2ng\u0103 asta, platforma este foarte mare. \u0218i lansarea unui stack de testare, chiar \u0219i pentru o or\u0103, chiar \u0219i pentru 8 ore \u2013 este o afacere destul de costisitoare. <\/p>\n<p><\/p>\n<p>\u0218i am automatizat acest proces. Jobul Jenkins permitea lansarea stack-ului. Era necesar s\u0103 se lanseze un pull request cu modific\u0103rile pe care dezvoltatorul dorea s\u0103 le testeze, specific\u00e2nd toate op\u021biunile necesare, componentele, precum \u0219i dimensiunile. Dac\u0103 dorea testare de performan\u021b\u0103, putea lua mai multe instances. Dac\u0103 voia doar s\u0103 verifice c\u0103 un formular se deschide, putea porni pe minim. De asemenea, putea specifica dac\u0103 era necesar un cluster sau nu \u0219i a\u0219a mai departe. <\/p>\n<p><\/p>\n<p>Apoi, Jenkins lansa un script shell, care modifica pu\u021bin codul din folderul Terraform. Elimin\u00e2nd fi\u0219ierele inutile, ad\u0103uga fi\u0219ierele necesare. \u0218i apoi, printr-o singur\u0103 execu\u021bie, Terraform apply ridica stack-ul. <\/p>\n<p><\/p>\n<p>Apoi urmeaz\u0103 alte etape, \u00een care nu vreau s\u0103 m\u0103 ad\u00e2ncesc. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/b288c0b320d8cb6e282db994bc1c1f43.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Din cauza c\u0103 pentru testare aveam nevoie de pu\u021bin mai multe op\u021biuni dec\u00e2t \u00een produc\u021bie, a fost necesar s\u0103 facem copii ale modulelor, pentru a putea ad\u0103uga acele func\u021bionalit\u0103\u021bi care sunt necesare doar \u00een testare. <\/p>\n<p><\/p>\n<p>\u0218i astfel s-a \u00eent\u00e2mplat c\u0103, \u00een testare, p\u0103rea c\u0103 vrem s\u0103 test\u0103m modific\u0103rile care, \u00een cele din urm\u0103, vor ajunge \u00een produc\u021bie. Dar, de fapt, se testa un lucru, iar \u00een produc\u021bie se aplica pu\u021bin altceva. \u0218i a existat o mic\u0103 discrepan\u021b\u0103, c\u0103 \u00een produc\u021bie toate modific\u0103rile erau aplicate de echipa de opera\u021biuni. \u0218i, uneori, se \u00eent\u00e2mpla c\u0103 modific\u0103rile care trebuiau s\u0103 treac\u0103 din testare \u00een produc\u021bie r\u0103m\u00e2neau \u00eentr-o alt\u0103 versiune. <\/p>\n<p><\/p>\n<p>\u00cen plus, a existat o problem\u0103 \u00een care se ad\u0103uga un nou serviciu, care era pu\u021bin diferit de unul deja existent. \u0218i \u00een loc s\u0103 modific\u0103m modulul existent, era necesar s\u0103 facem o copie a acestuia \u0219i s\u0103 ad\u0103ug\u0103m modific\u0103rile necesare. <\/p>\n<p><\/p>\n<p>\u00cen esen\u021b\u0103, Terraform nu este un adev\u0103rat limbaj. Este o declara\u021bie. Dac\u0103 trebuie s\u0103 declar\u0103m ceva, atunci o facem. \u0218i totul func\u021bioneaz\u0103.<\/p>\n<p><\/p>\n<p>\u00centr-un anumit moment, c\u00e2nd se discuta despre una dintre cererile mele de pull, unul dintre colegi a spus c\u0103 nu trebuie s\u0103 cre\u0103m z\u0103pad\u0103. M-a interesat ceea ce avea \u00een minte. Exist\u0103 un fapt \u0219tiin\u021bific conform c\u0103ruia nu exist\u0103 dou\u0103 fulgi de z\u0103pad\u0103 identici \u00een lume; to\u021bi sunt pu\u021bin diferi\u021bi. \u0218i imediat ce am auzit asta, am sim\u021bit toat\u0103 greutatea codului Terraform. Pentru c\u0103, atunci c\u00e2nd era necesar s\u0103 trecem de la o versiune la alta, Terraform necesita modific\u0103ri care \u00eembin\u0103. Adic\u0103, codul nu mai era compatibil cu urm\u0103toarea versiune. \u0218i era necesar s\u0103 facem o cerere de pull care acoperea aproape jum\u0103tate din fi\u0219ierele din infrastructur\u0103, pentru a aduce infrastructura la urm\u0103toarea versiune de Terraform.<\/p>\n<p><\/p>\n<p>\u0218i dup\u0103 ce a ap\u0103rut aceast\u0103 z\u0103pad\u0103, tot codul Terraform pe care \u00eel aveam se transforma \u00eentr-un mare munte de z\u0103pad\u0103. <\/p>\n<p><\/p>\n<p>Pentru un dezvoltator extern, care nu face parte din opera\u021biuni, acest lucru nu are o mare importan\u021b\u0103, deoarece el a f\u0103cut o cerere de pull, resursa sa a fost lansat\u0103. \u0218i at\u00e2t, nu mai este grija lui. Dar echipei DevOps, care monitorizeaz\u0103 totul pentru a fi \u00een regul\u0103, \u00eei sunt cerute toate aceste modific\u0103ri. Iar costul acestor modific\u0103ri cre\u0219tea foarte mult cu fiecare z\u0103pad\u0103 suplimentar\u0103.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/d07039414027798861d1424bb2c686b6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Exist\u0103 o poveste despre un student care deseneaz\u0103 la seminar dou\u0103 cercuri perfecte cu creta pe tabl\u0103. Iar profesorul se mir\u0103 cum a reu\u0219it s\u0103 le deseneze at\u00e2t de uniform f\u0103r\u0103 compas. Studentul r\u0103spunde: \u201eFoarte simplu, am petrecut doi ani \u00een armat\u0103 r\u0103sucind o ma\u0219in\u0103 de tocat carne.\u201d <\/p>\n<p><\/p>\n<p>\u0218i din cei patru ani \u00een care particip la acest proiect, aproximativ doi ani m\u0103 ocup de Terraform. \u0218i, desigur, am c\u00e2teva trucuri, c\u00e2teva sfaturi despre cum s\u0103 simplific codul Terraform, s\u0103 lucrez cu el ca pe un limbaj de programare \u0219i s\u0103 reduc povara asupra dezvoltatorilor care trebuie s\u0103 men\u021bin\u0103 acest cod actualizat. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/9413c6adf1933482dcc822b021773df9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Primul lucru cu care a\u0219 vrea s\u0103 \u00eencep este Symlinks. Terraform are mult cod repetitiv. De exemplu, apelul provider-ului este practic \u00een fiecare punct \u00een care cre\u0103m un element de infrastructur\u0103, acela\u0219i. \u0218i e logic s\u0103-l mut\u0103m \u00eentr-un folder separat. \u0218i \u00een toate locurile unde este necesar, provider-ul s\u0103 fac\u0103 Symlinks la acest fi\u0219ier. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/6dcf36cc8c94e7a70cf6ab1456cc1215.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De exemplu, ave\u021bi \u00een produc\u021bie un assume role, care v\u0103 permite s\u0103 ob\u021bine\u021bi drepturi de acces la un cont Amazon extern. \u0218i prin schimbarea unui fi\u0219ier, toate celelalte din arborele de resurse vor avea drepturile necesare pentru ca Terraform s\u0103 \u0219tie la ce segment Amazon s\u0103 se adreseze. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/6df9a89ef48ae9a7adda7fb1f86b76aa.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Unde nu func\u021bioneaz\u0103 Symlinks? A\u0219a cum am spus, \u00een Terraform exist\u0103 fi\u0219iere de stare. \u0218i acestea sunt foarte, foarte utile. Dar problema este c\u0103 Terraform ini\u021bializeaz\u0103 backend-ul \u00een primul r\u00e2nd. \u0218i nu poate folosi \u00een aceste parametri variabile, acestea trebuie scrise \u00eentotdeauna \u00een text. <\/p>\n<p><\/p>\n<p>\u0218i ca rezultat, c\u00e2nd cineva creeaz\u0103 un nou resource, el copiaz\u0103 o parte din cod din alte foldere. \u0218i poate gre\u0219i cu cheia sau cu bucket-ul. De exemplu, el face din sandbox un lucru de sandbox, iar apoi \u00eel face \u00een produc\u021bie. \u0218i astfel poate s\u0103 se \u00eent\u00e2mple ca bucket-ul din produc\u021bie s\u0103 fie utilizat din sandbox. Desigur, asta va fi rapid descoperit\u0103. Se poate corecta cumva, dar totu\u0219i este o pierdere de timp \u0219i, \u00eentr-o oarecare m\u0103sur\u0103, de resurse. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/757294dc6a1a27fc4a5fe174cc4aa7d7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ce putem face mai departe? \u00cenainte de a lucra cu Terraform, trebuie s\u0103-l ini\u021bializ\u0103m. \u00cen momentul ini\u021bializ\u0103rii, Terraform descarc\u0103 toate pluginurile. Acestea, la un moment dat, au fost desp\u0103r\u021bite dintr-o arhitectur\u0103 monolitic\u0103 \u00eentr-o arhitectur\u0103 microserviciu. \u0218i trebuie s\u0103 facem \u00eentotdeauna Terraform init, pentru ca acesta s\u0103 trag\u0103 toate modulele, toate pluginurile.<\/p>\n<p><\/p>\n<p>\u0218i putem folosi un script shell, care, pe de-o parte, va putea extrage toate variabilele. Scriptul shell nu are limite. \u0218i, pe de alt\u0103 parte, c\u0103ile. Dac\u0103 folosim \u00eentotdeauna acea cale care se afl\u0103 \u00een repository ca cheie pentru fi\u0219ierul de stare, atunci, prin urmare, eroarea va fi exclus\u0103. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/b70dbc6d8edb1b255c64d722a7e40680.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De unde s\u0103 extragem datele? Fi\u0219ier JSON. Terraform permite scrierea infrastructurii nu doar \u00een hcl (HashiCorp Configuration Language), ci \u0219i \u00een JSON.<\/p>\n<p><\/p>\n<p>JSON poate fi citit u\u0219or din scriptul shell. Prin urmare, putem plasa un fi\u0219ier de configurare cu bucket \u00eentr-un loc \u0219i s\u0103 folosim acest bucket at\u00e2t \u00een codul Terraform, c\u00e2t \u0219i \u00een scriptul shell pentru ini\u021bializare. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/a18b92cac763003ec49af8d4a37e19d9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De ce este important s\u0103 ai un bucket pentru Terraform? Pentru c\u0103 exist\u0103 un lucru numit fi\u0219iere de stare remote. Adic\u0103, atunci c\u00e2nd ridic un anumit resource, pentru a spune Amazon: \u201eTe rog, ridic\u0103 un instance\u201d, trebuie s\u0103 indic multe parametrii obligatorii. <\/p>\n<p><\/p>\n<p>\u0218i aceste identificatoare sunt stocate \u00eentr-un alt folder. Pot s\u0103 spun: \u201eTerraform, te rog, mergi \u00een fi\u0219ierul de stare al acelui resource \u0219i adu-mi aceste identificatoare\u201d. Astfel apare o anumit\u0103 unificare \u00eentre diferite regiuni sau medii.<\/p>\n<p><\/p>\n<p>Nu este \u00eentotdeauna posibil s\u0103 folose\u0219ti un fi\u0219ier de stare remote. De exemplu, ai creat manual un VPC. \u0218i codul Terraform care creeaz\u0103 VPC-ul creeaz\u0103 un VPC at\u00e2t de diferit, \u00eenc\u00e2t \u00ee\u021bi va lua mult timp s\u0103 adaptezi unul la altul, de aceea po\u021bi folosi urm\u0103toarea solu\u021bie. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/04ffcd97e2fae323d9b4d81e5f6c751a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Adic\u0103, s\u0103 faci un modul care s\u0103 creeze VPC-ul \u0219i s\u0103-\u021bi ofere identificatoarele, dar de fapt exist\u0103 doar un fi\u0219ier cu valori hardcodate, care poate fi folosit pentru a crea acela\u0219i instance.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/9cd878c459f377caf5af9bf27b026187.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nu este \u00eentotdeauna necesar s\u0103 p\u0103strezi fi\u0219ierul de stare \u00een cloud. De exemplu, c\u00e2nd testezi modulele, po\u021bi folosi ini\u021bializarea backend-ului, c\u00e2nd fi\u0219ierul va fi salvat pur \u0219i simplu pe disc pe durata test\u0103rii.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/70fee8d4105cfddacafeec00825127b5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Acum pu\u021bin despre testare. Ce se poate testa \u00een Terraform? Probabil, multe lucruri se pot testa, dar voi vorbi despre aceste 4 aspecte.<\/p>\n<p><\/p>\n<p>HashiCorp are o viziune asupra modului \u00een care trebuie formatat codul Terraform. Terraform fmt \u00ee\u021bi permite s\u0103 formatezi codul pe care \u00eel editezi conform acestei viziuni. Prin urmare, testele trebuie s\u0103 verifice dac\u0103 formatul este conform cu ceea ce a l\u0103sat HashiCorp, astfel \u00eenc\u00e2t s\u0103 nu fie necesar s\u0103 schimbi pozi\u021bia parantezelor etc. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/bb99ffdd9f963f0f44ea7b5379689737.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Urm\u0103torul este Terraform validate. El face pu\u021bin mai mult dec\u00e2t o verificare sintactic\u0103 - adic\u0103, dac\u0103 toate parantezele sunt pereche. Ce este important aici? Infrastructura noastr\u0103 este foarte extins\u0103. Are foarte multe foldere diferite. \u0218i \u00een fiecare trebuie s\u0103 rulezi Terraform validate.<\/p>\n<p><\/p>\n<p>Astfel, pentru a accelera testarea, rul\u0103m mai multe procese \u00een paralel, folosind paralelismul. <\/p>\n<p><\/p>\n<p>Paralelismul este o chestie foarte grozav\u0103, folosi\u021bi-l.<\/p>\n<p><\/p>\n<p>Dar de fiecare dat\u0103 c\u00e2nd se ini\u021biaz\u0103 Terraform, acesta se conecteaz\u0103 la HashiCorp \u0219i \u00eentreab\u0103: \u201eCare sunt cele mai recente versiuni ale pluginurilor? \u0218i acel plugin pe care \u00eel am \u00een cache \u2013 este acela sau nu?\u201d. Iar acest lucru \u00eencetine\u0219te procesul la fiecare pas. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/836e90327c7a60c493f42f0a055e248b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dac\u0103 \u00eei spui lui Terraform unde se afl\u0103 pluginurile, va r\u0103spunde: \u201eOk, probabil c\u0103 aceasta este cea mai recent\u0103 versiune. Nu voi c\u0103uta altundeva, voi \u00eencepe imediat s\u0103 valideaz\u0103 codul t\u0103u Terraform\u201d.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/8ab344cf8de7087d30a1212d44691c20.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pentru a completa folderul cu pluginurile necesare, avem un cod Terraform foarte simplu care trebuie doar ini\u021bializat. Aici, desigur, trebuie s\u0103 specifici to\u021bi providerii care particip\u0103 \u00een codul t\u0103u, altfel Terraform va spune: \u201eNu cunosc niciun provider, pentru c\u0103 nu este \u00een cache\u201d.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/b8130753045624d38bce32ba08b56fb0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Urm\u0103torul pas este Terraform plan. A\u0219a cum am spus, dezvoltarea este ciclic\u0103. Facem cod cu modific\u0103ri. \u0218i apoi trebuie s\u0103 \u0219tim ce modific\u0103ri sunt planificate pentru infrastructur\u0103. <\/p>\n<p><\/p>\n<p>\u0218i c\u00e2nd infrastructura este foarte, foarte mare, po\u021bi schimba un modul, repara o mediu de testare sau un anumit regiune \u0219i po\u021bi strica un vecin. De aceea, Terraform plan trebuie realizat pentru \u00eentreaga infrastructur\u0103 \u0219i s\u0103 arate ce modific\u0103ri sunt planificate.<\/p>\n<p><\/p>\n<p>Acest lucru poate fi realizat inteligent. De exemplu, am scris un script \u00een Python, care rezolv\u0103 dependen\u021bele. \u00cen func\u021bie de ce a fost modificat: modul Terraform sau un anumit component, acesta creeaz\u0103 planuri pentru toate folderele dependente.<\/p>\n<p><\/p>\n<p>Terraform plan ar trebui s\u0103 fie realizat la cerere. Cel pu\u021bin, aceasta este ceea ce facem noi. <\/p>\n<p><\/p>\n<p>Testele, desigur, sunt bine de realizat pentru fiecare modificare, pentru fiecare commit, dar planurile sunt oarecum costisitoare. \u0218i \u00een pull request spunem: \u201eTe rog, d\u0103-mi planurile\u201d. Se activeaz\u0103 un robot. \u0218i trimite \u00een comentarii sau \u00een ata\u0219amente toate planurile care sunt anticipate din modific\u0103rile tale. <\/p>\n<p><\/p>\n<p>Planul este o resurs\u0103 destul de costisitoare. Acesta necesit\u0103 timp, pentru c\u0103 Terraform merge \u00een Amazon \u0219i \u00eentreab\u0103: \u201eExist\u0103 \u00eenc\u0103 acest instance? Are acest autoscale exact aceste parametrii?\u201d. Iar pentru a accelera acest proces, po\u021bi folosi un parametru precum refresh=false. Asta \u00eenseamn\u0103 c\u0103 Terraform va desc\u0103rca din S3 statele. \u0218i va crede c\u0103 starea corespunde exact cu ceea ce se afl\u0103 \u00een Amazon.<\/p>\n<p><\/p>\n<p>Acest plan Terraform se execut\u0103 mult mai repede, dar state-ul trebuie s\u0103 corespund\u0103 infrastructurii tale, adic\u0103, undeva, c\u00e2ndva, trebuie s\u0103 ruleze Terraform refresh. Terraform refresh face exact ceea ce este necesar pentru ca state-ul s\u0103 corespund\u0103 ceea ce se afl\u0103 \u00een infrastructura real\u0103. <\/p>\n<p><\/p>\n<p>\u0218i trebuie s\u0103 vorbim despre securitate. De aici trebuia s\u0103 \u00eencepem. Acolo unde rulezi Terraform \u0219i Terraform lucreaz\u0103 cu infrastructura ta, exist\u0103 o vulnerabilitate. Asta \u00eenseamn\u0103 c\u0103, \u00een esen\u021b\u0103, rulezi cod. \u0218i dac\u0103 pull request-ul con\u021bine cod mali\u021bios, acesta poate fi executat pe infrastructura care are prea mult acces. A\u0219adar, fii atent unde rulezi Terraform plan.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/2153cc01acf2b1f46978f837b82b317e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Urm\u0103torul lucru despre care a\u0219 dori s\u0103 vorbesc este testarea user-data.<\/p>\n<p><\/p>\n<p>Ce este user-data? \u00cen Amazon, c\u00e2nd cre\u0103m o instan\u021b\u0103, putem trimite un anumit mesaj din cadrul instan\u021bei \u2013 metadate. C\u00e2nd instan\u021ba porne\u0219te, de obicei cloud init este \u00eentotdeauna prezent pe aceste instan\u021be. Cloud init cite\u0219te acest mesaj \u0219i spune: \u201eOk, ast\u0103zi eu sunt load balancer\u201d. \u0218i conform acestor porunci, efectueaz\u0103 anumite ac\u021biuni.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/406ac9341e102f5e0d7ca239d10675cd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Din p\u0103cate, atunci c\u00e2nd facem Terraform plan \u0219i Terraform apply, user-data arat\u0103 ca un amestec de cifre. Adic\u0103, \u00ee\u021bi trimite pur \u0219i simplu un hash. \u0218i tot ce po\u021bi verifica \u00een plan este dac\u0103 sunt schimb\u0103ri sau hash-ul r\u0103m\u00e2ne acela\u0219i. <\/p>\n<p><\/p>\n<p>\u0218i dac\u0103 nu acorzi aten\u021bie acestui aspect, atunci pe Amazon, un fi\u0219ier text corupt ar putea ajunge \u00een infrastructura real\u0103. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/cd7b56f1149d9cbebb0ad3228c0eeb5f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O variant\u0103 ar fi s\u0103 specifici, la execu\u021bie, nu toat\u0103 infrastructura, ci doar template-ul. \u0218i \u00een cod s\u0103 spui: \u201eTe rog, afi\u0219eaz\u0103-mi acest template\u201d. Astfel, po\u021bi ob\u021bine o imagine despre cum vor ar\u0103ta datele tale pe Amazon.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/86da779cdf7f9cacfd80a196efde47f7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O alt\u0103 variant\u0103 este s\u0103 folose\u0219ti un modul pentru generarea user-data. Aplici acest modul. Ob\u021bii un fi\u0219ier pe disc. \u00cel compari cu referin\u021ba. \u0218i astfel, dac\u0103 un junior decide s\u0103 modifice pu\u021bin user-data, testele tale \u00eei vor spune: \u201eOk, aici \u0219i aici sunt unele modific\u0103ri \u2013 este \u00een regul\u0103\u201d.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/7e69ec1b2c04710066d93ee48f872254.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Urm\u0103torul lucru despre care a\u0219 dori s\u0103 vorbesc este Automatizarea Terraform apply.<\/p>\n<p><\/p>\n<p>Desigur, este destul de \u00eenfrico\u0219\u0103tor s\u0103 faci Terraform apply \u00een mod automat, deoarece cine \u0219tie ce modific\u0103ri au venit \u0219i c\u00e2t de devastatoare pot fi pentru infrastructura live. <\/p>\n<p><\/p>\n<p>Pentru un mediu de testare - totul este \u00een regul\u0103. Adic\u0103, jobul care creeaz\u0103 un mediu de testare este ceea ce au nevoie to\u021bi dezvoltatorii. \u0218i expresia \u201etotul a mers bine\u201d nu este un meme amuzant, ci o dovad\u0103 c\u0103 o persoan\u0103 s-a preocupat, a creat stiva, a rulat pe aceast\u0103 stiv\u0103 c\u00e2teva teste. \u0218i s-a asigurat c\u0103 totul este \u00een regul\u0103 \u0219i a spus: \u201eOk, codul pe care \u00eel public, a fost testat.\u201d<\/p>\n<p><\/p>\n<p>\u00cen produc\u021bie, sandbox \u0219i alte medii care sunt mai importante pentru afacere, se pot aplica par\u021bial unele resurse \u00een mod destul de sigur, deoarece nu duce la moartea cuiva. Acestea sunt: grupuri autoscale, grupuri de securitate, roluri, route53 \u0219i lista poate fi destul de mare. Dar urm\u0103ri\u021bi ceea ce se \u00eent\u00e2mpl\u0103, citi\u021bi rapoartele despre aplica\u021biile automate. <\/p>\n<p><\/p>\n<p>Acolo unde aplicarea este periculoas\u0103 sau tem\u0103toare, de exemplu, dac\u0103 sunt anumite resurse persistente, cum ar fi bazele de date, ob\u021bine\u021bi rapoarte despre faptul c\u0103 \u00een vreo zon\u0103 a infrastructurii exist\u0103 modific\u0103ri neaplicate. \u0218i inginerul, sub supraveghere, lanseaz\u0103 joburi pentru a aplica sau face asta din consola sa. <\/p>\n<p><\/p>\n<p>Amazon are un mecanism numit Terminate protection. Acesta poate proteja \u00een anumite cazuri \u00eempotriva modific\u0103rilor nedorite pentru dumneavoastr\u0103. Adic\u0103 Terraform a mers pe Amazon \u0219i spune: \u201eTrebuie s\u0103 distrug acest instance pentru a crea altul.\u201d Iar Amazon spune: \u201e\u00cemi pare r\u0103u, nu azi. Avem activat\u0103 protec\u021bia \u00eempotriva termin\u0103rii.\u201d<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/9f4258d8688556829586a1e308f5a1e2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Iar cire\u0219a de pe tort - este optimizarea codului. C\u00e2nd lucr\u0103m cu codul Terraform, trebuie s\u0103 trecem \u00een modul un num\u0103r foarte mare de parametri. Ace\u0219tia sunt parametrii care sunt necesari pentru a crea o resurs\u0103. \u0218i codul devine o list\u0103 mare de parametri, care trebuie transmi\u0219i din modul \u00een modul, din modul \u00een modul, mai ales dac\u0103 modulele sunt \u00eennestate. <\/p>\n<p><\/p>\n<p>\u0218i este foarte greu de citit. Este foarte greu de f\u0103cut revizuirea. \u0218i adesea se \u00eent\u00e2mpl\u0103 ca anumite parametrii s\u0103 treac\u0103 revizuirea \u0219i s\u0103 nu fie chiar cei necesari. Iar acest lucru cost\u0103 timp \u0219i bani, pentru a corecta ulterior.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/ad7e8a91692212fda9f2561854b881c9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De aceea, v\u0103 propun s\u0103 folosi\u021bi un parametru complex, care include o anumit\u0103 structur\u0103 a valorilor. Adic\u0103, ave\u021bi nevoie de un dosar \u00een care sunt indicate toate valorile pe care a\u021bi dori s\u0103 le ave\u021bi pe un anumit mediu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/909632949eb30057bf86b116239d9077.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0218i apel\u00e2nd la acest modul, se poate ob\u021bine un arbore care este generat \u00eentr-un singur modul comun, adic\u0103 un modul comun care func\u021bioneaz\u0103 uniform pentru \u00eentreaga infrastructur\u0103.<\/p>\n<p><\/p>\n<p>\u00cen acest modul, se pot face anumite calcule, folosind o caracteristic\u0103 nou\u0103 \u00een Terraform, cum ar fi locals. \u0218i apoi, cu un output, se poate oferi un parametru complex, care poate include hash-uri, array-uri etc. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/25c14e0397f8d95c301e0dfe6ae761df.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aici s-au \u00eencheiat toate cele mai bune descoperiri pe care le am. A\u0219 dori s\u0103 povestesc o legend\u0103 despre Columb. C\u00e2nd c\u0103uta bani pentru expedi\u021bia sa, pentru a descoperi India (a\u0219a cum credea el atunci), nimeni nu l-a crezut \u0219i toat\u0103 lumea considera c\u0103 este imposibil. Atunci a spus: \u201eFace\u021bi ca oul s\u0103 nu cad\u0103\u201d. To\u021bi bancherii, oameni foarte boga\u021bi \u0219i, probabil, de\u0219tep\u021bi, au \u00eencercat \u00een diverse moduri s\u0103 sprijine oul, iar acesta c\u0103dea mereu. Atunci Columb a luat oul, a ap\u0103sat pu\u021bin pe el. Coaja s-a strivit \u0219i oul a r\u0103mas nemi\u0219cat. Ei au spus: \u201eOh, asta e prea simplu!\u201d. Iar Columb a r\u0103spuns: \u201eDa, este prea simplu. \u0218i c\u00e2nd voi descoperi India, toat\u0103 lumea va folosi aceast\u0103 rut\u0103 comercial\u0103.\u201d <\/p>\n<p><\/p>\n<p>Iar ceea ce v-am povestit acum sunt, probabil, lucruri destul de simple \u0219i triviale. \u0218i c\u00e2nd le descoperi \u0219i \u00eencepi s\u0103 le folose\u0219ti, devine un lucru firesc. A\u0219a c\u0103 folosi\u021bi-le. \u0218i dac\u0103 pentru voi aceste lucruri sunt absolut normale, atunci, m\u0103car, \u0219ti\u021bi cum s\u0103 sprijini\u021bi oul astfel \u00eenc\u00e2t s\u0103 nu cad\u0103. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/37bf83d04b99f089f2319c8d2e8aaeb4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S\u0103 facem o sintez\u0103: <\/p>\n<p><\/p>\n<ul>\n<li>\u00cencerca\u021bi s\u0103 evita\u021bi fulgii de nea. Cu c\u00e2t sunt mai pu\u021bini fulgi de nea, cu at\u00e2t mai pu\u021bine resurse v\u0103 vor fi necesare pentru a face modific\u0103ri \u00een toat\u0103 infrastructura voastr\u0103 mare. <\/li>\n<li>Modific\u0103ri constante. Adic\u0103, atunci c\u00e2nd \u00een cod au avut loc modific\u0103ri, trebuie s\u0103 aduce\u021bi infrastructura \u00een conformitate cu aceste modific\u0103ri c\u00e2t mai repede posibil. Nu ar trebui s\u0103 existe situa\u021bii \u00een care cineva vine dup\u0103 dou\u0103-trei luni s\u0103 verifice Elasticsearch, face un Terraform plan \u0219i acolo sunt o mul\u021bime de modific\u0103ri pe care nu le-a\u0219tepta. \u0218i se pierde foarte mult timp pentru a aduce totul \u00eenapoi \u00een ordine. <\/li>\n<li>Teste \u0219i automatizare. Cu c\u00e2t codul vostru este mai mult acoperit de teste \u0219i func\u021bionalit\u0103\u021bi, cu at\u00e2t ave\u021bi mai mult\u0103 \u00eencredere c\u0103 face\u021bi totul corect. Iar livrarea automat\u0103 va cre\u0219te \u00eencrederea voastr\u0103 de mai multe ori. <\/li>\n<li>Codul pentru medii de testare \u0219i de produc\u021bie ar trebui s\u0103 fie practic identic. Practic, pentru c\u0103 totu\u0219i produc\u021bia este pu\u021bin diferit\u0103 \u0219i vor exista totu\u0219i nuan\u021be care dep\u0103\u0219esc aria de testare. Dar totu\u0219i, plus-minus se poate asigura acest lucru. <\/li>\n<li>\u0218i dac\u0103 ave\u021bi foarte mult cod Terraform \u0219i \u00eentre\u021binerea acestuia necesit\u0103 foarte mult timp, niciodat\u0103 nu e prea t\u00e2rziu s\u0103 face\u021bi refactoring \u0219i s\u0103-l aduce\u021bi \u00eentr-o form\u0103 bun\u0103. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/68f3946536f44eed33939b234fb3ca0d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Infrastructur\u0103 imutabil\u0103. Livrarea AMI conform unui program. <\/li>\n<li>Structura pentru route53, atunci c\u00e2nd ave\u021bi foarte multe \u00eenregistr\u0103ri \u0219i dori\u021bi s\u0103 fie \u00eentr-o ordine coeziv\u0103. <\/li>\n<li>Lupta cu limitele de rat\u0103 ale API-ului. Aceasta este atunci c\u00e2nd Amazon spune: \u201eTotul, totul, nu mai pot accepta cereri, v\u0103 rog s\u0103 a\u0219tepta\u021bi\u201d. \u0218i jum\u0103tate din companie a\u0219teapt\u0103 p\u00e2n\u0103 c\u00e2nd poate lansa infrastructura. <\/li>\n<li>Instan\u021be Spot. Amazon \u2013 o activitate costisitoare, iar spot-urile permit economii semnificative. Se poate face o \u00eentreag\u0103 prezentare despre asta. <\/li>\n<li>Securitate \u0219i roluri IAM. <\/li>\n<li>C\u0103utarea resurselor pierdute, atunci c\u00e2nd ave\u021bi \u00een Amazone instan\u021be de origine necunoscut\u0103, care consum\u0103 bani. Chiar dac\u0103 o instan\u021b\u0103 cost\u0103 100-150 de dolari pe lun\u0103 \u2013 aceasta \u00eenseamn\u0103 mai mult de 1.000 pe an. G\u0103sirea acestor resurse este o activitate profitabil\u0103. <\/li>\n<li>\u0218i instan\u021be rezervate. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Modele \u00een Terraform pentru a lupta \u00eempotriva haosului \u0219i rutinei manuale. Maxim Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/69ddbf4c726bcc15aea1a1e2d67a3fc8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Asta a fost tot din partea mea. Terraform este foarte cool, folosi\u021bi-l. Mul\u021bumesc!<\/p>\n<p><\/p>\n<p>\u00centreb\u0103ri<\/p>\n<p><\/p>\n<p><em>Mul\u021bumesc pentru prezentare! Fi\u0219ierul vostru de state este stocat \u00een S3, cum rezolva\u021bi problema c\u0103 mai multe persoane ar putea accesa acest fi\u0219ier de stare \u0219i ar \u00eencerca s\u0103-l desf\u0103\u0219oare?<\/em><\/p>\n<p><\/p>\n<p>\u00cen primul r\u00e2nd, nu ne gr\u0103bim. \u00cen al doilea r\u00e2nd, exist\u0103 flag-uri prin care anun\u021b\u0103m c\u0103 lucr\u0103m la un anumit cod. Adic\u0103, de\u0219i infrastructura este foarte mare, nu \u00eenseamn\u0103 c\u0103 cineva aplic\u0103 constant ceva. \u0218i c\u00e2nd a fost faza activ\u0103 \u2013 aceasta era o problem\u0103, fi\u0219ierele noastre de stare erau stocate \u00een Git. Acest lucru era important, altfel cineva ar fi creat un fi\u0219ier de stare \u0219i trebuia s\u0103 le adun\u0103m manual pentru a continua. Acum nu mai avem aceast\u0103 problem\u0103. \u00cen general, Terraform a rezolvat aceast\u0103 problem\u0103. \u0218i dac\u0103 se schimb\u0103 constant ceva, atunci se pot folosi bloc\u0103ri, care previn ce a\u021bi spus.<\/p>\n<p><\/p>\n<p><em>Folosi\u021bi versiunea deschis\u0103 sau cea enterprise?<\/em><\/p>\n<p><\/p>\n<p>Nicio versiune enterprise, adic\u0103 tot ce se poate desc\u0103rca gratuit. <\/p>\n<p><\/p>\n<p><em>M\u0103 numesc Stanislav. A\u0219 dori s\u0103 fac o mic\u0103 completare. A\u021bi discutat despre func\u021bia Amazon care permite crearea unui instance indestructibil. Acest lucru este disponibil \u0219i \u00een Terraform, \u00een blocul Life Second pute\u021bi specifica o interdic\u021bie de modificare sau o interdic\u021bie de distrugere.<\/em> <\/p>\n<p><\/p>\n<p>A avut un timp limitat. O observa\u021bie bun\u0103. <\/p>\n<p><\/p>\n<p><em>De asemenea, a\u0219 dori s\u0103 \u00eentreb dou\u0103 lucruri. \u00cen primul r\u00e2nd, a\u021bi vorbit despre testare. A\u021bi folosit vreun instrument pentru testare? Am auzit despre pluginul Test Kitchen. Poate c\u0103 exist\u0103 ceva \u00een plus. \u0218i a\u0219 vrea s\u0103 \u00eentreb despre Local Values. Cu ce se deosebesc \u00een principal de Input Variables? \u0218i de ce nu pot parametriza ceva doar prin Local Values? Am \u00eencercat s\u0103 \u00een\u021beleg acest subiect, dar cumva nu am reu\u0219it.<\/em><\/p>\n<p><\/p>\n<p>Putem discuta mai \u00een detaliu despre acest lucru \u00een afara s\u0103lii. Instrumentele pentru testare - sunt complet improvisate de noi. Nu exist\u0103 nimic acolo pentru a testa. Dar, \u00een general, exist\u0103 op\u021biuni \u00een care teste automate ridic\u0103 infrastructura undeva, verific\u0103 dac\u0103 este \u00een regul\u0103 \u0219i apoi o distrug cu un raport c\u0103 infrastructura dvs. este \u00eenc\u0103 \u00een form\u0103 bun\u0103. Nu avem asta, deoarece stivele de testare sunt lansate \u00een fiecare zi. \u0218i este suficient. Dac\u0103 ceva \u00eencepe s\u0103 se strice, va \u00eencepe s\u0103 se strice f\u0103r\u0103 s\u0103 verific\u0103m asta \u00een alt\u0103 parte. <\/p>\n<p><\/p>\n<p>\u00cen leg\u0103tur\u0103 cu Local Values, haide\u021bi s\u0103 continu\u0103m discu\u021bia \u00een afara s\u0103lii. <\/p>\n<p><\/p>\n<p><em>Salut! Mul\u021bumesc pentru prezentare! Foarte informativ. Ai men\u021bionat c\u0103 ave\u021bi foarte mult cod similar pentru descrierea infrastructurii. A\u021bi luat \u00een considerare genera\u021bia acestui cod?<\/em><\/p>\n<p><\/p>\n<p>\u00centrebare excelent\u0103, mul\u021bumesc! Adev\u0103rul este c\u0103, atunci c\u00e2nd folosim infrastructura ca Cod, presupunem c\u0103 ne uit\u0103m la cod \u0219i \u00een\u021belegem ce infrastructur\u0103 st\u0103 la baza acelui cod. Dac\u0103 codul este generat, trebuie s\u0103 ne imagin\u0103m ce cod va fi generat pentru a \u00een\u021belege ce infrastructur\u0103 va fi acolo. Fie gener\u0103m codul, fie \u00eel angaj\u0103m \u0219i, \u00een esen\u021b\u0103, ob\u021binem acela\u0219i lucru. De aceea, am urmat calea pe care am scris-o, am ob\u021binut asta. \u00cen plus, generatoarele au ap\u0103rut ceva mai t\u00e2rziu, c\u00e2nd am \u00eenceput s\u0103 lucr\u0103m, \u0219i era deja prea t\u00e2rziu s\u0103 schimb\u0103m.<\/p>\n<p><\/p>\n<p><em>Ai auzit ceva despre jsonnet?<\/em><\/p>\n<p><\/p>\n<p>Nu. <\/p>\n<p><\/p>\n<p><em>Uit\u0103-te, este un instrument foarte bun. V\u0103d un caz concret \u00een care poate fi aplicat pentru a genera o structur\u0103 de date.<\/em> <\/p>\n<p><\/p>\n<p>Generatoarele sunt utile, a\u0219a cum spune gluma cu aparatul de ras. Adic\u0103, prima dat\u0103 fa\u021ba este diferit\u0103, dar apoi toat\u0103 lumea are aceea\u0219i fa\u021b\u0103. Generatoarele sunt foarte atractive. Dar din p\u0103cate, fe\u021bele noastre sunt pu\u021bin diferite. Aceasta este problema. <\/p>\n<p><\/p>\n<p><em>Uit\u0103-te! Mul\u021bumesc!<\/em><\/p>\n<p><\/p>\n<p><em>M\u0103 numesc Maxim, sunt de la Sberbank. A\u021bi men\u021bionat pu\u021bin c\u0103 a\u021bi \u00eencercat s\u0103 adapta\u021bi Terraform ca un limbaj de programare. Nu ar fi mai simplu s\u0103 folosi\u021bi Ansible?<\/em><\/p>\n<p><\/p>\n<p>Sunt lucruri foarte diferite. Po\u021bi crea resurse \u0219i cu Ansible, \u0219i cu Puppet, \u00een Amazon. Dar Terraform este specializat pentru asta. <\/p>\n<p><\/p>\n<p><em>Ave\u021bi doar Amazon?<\/em><\/p>\n<p><\/p>\n<p>Nu este vorba c\u0103 avem doar Amazon. Avem aproape doar Amazon. Dar tr\u0103s\u0103tura principal\u0103 este c\u0103 Terraform \u00ee\u0219i aminte\u0219te. \u00cen Ansible, dac\u0103 spui: \u201eCreeaz\u0103-mi 5 instan\u021be\u201d, el le va crea, iar apoi spui: \u201eAcum am nevoie de 3\u201d. \u0218i Terraform va spune: \u201eBine, voi \u0219terge 2\u201d, iar Ansible va spune: \u201eBine, iat\u0103-\u021bi 3\u201d. A\u0219adar, avem 8.<\/p>\n<p><\/p>\n<p><em>Bun\u0103 ziua! Mul\u021bumesc pentru prezentarea dumneavoastr\u0103! A fost foarte interesant s\u0103 ascult despre Terraform. Vreau s\u0103 fac un mic comentariu \u00een leg\u0103tur\u0103 cu faptul c\u0103 Terraform nu are, totu\u0219i, o versiune stabil\u0103, a\u0219a c\u0103 trebuie s\u0103 ave\u021bi mare grij\u0103 cu Terraform.<\/em><\/p>\n<p><\/p>\n<p>C\u00e2nd e vorba de o situa\u021bie urgent\u0103, uneori am\u00e2ni ceea ce nu este stabil etc., dar func\u021bioneaz\u0103 \u0219i ne-a ajutat. <\/p>\n<p><\/p>\n<p><em>Am o \u00eentrebare. Folosi\u021bi Remote backend, folosi\u021bi S3. De ce nu folosi\u021bi backend-ul oficial?<\/em><\/p>\n<p><\/p>\n<p>Oficial?<\/p>\n<p><\/p>\n<p><em>Terraform Cloud.<\/em><\/p>\n<p><\/p>\n<p>C\u00e2nd a ap\u0103rut?<\/p>\n<p><\/p>\n<p><em>Cu aproximativ 4 luni \u00een urm\u0103.<\/em> <\/p>\n<p><\/p>\n<p>Dac\u0103 ar fi ap\u0103rut acum 4 ani, probabil a\u0219 fi r\u0103spuns la \u00eentrebarea dumneavoastr\u0103.<\/p>\n<p><\/p>\n<p><em>Acolo exist\u0103 deja o func\u021bie \u00eencorporat\u0103 \u0219i lock-uri, \u0219i se poate stoca fi\u0219ierul de stare. \u00cencerca\u021bi-l. Dar nici eu nu l-am testat.<\/em><\/p>\n<p><\/p>\n<p>Ne afl\u0103m \u00eentr-un tren mare care se mi\u0219c\u0103 cu vitez\u0103. \u0218i nu po\u021bi pur \u0219i simplu s\u0103 arunci c\u00e2teva vagoane. <\/p>\n<p><\/p>\n<p><em>A\u021bi vorbit despre fulgi de zapad\u0103; de ce nu a\u021bi folosit branch? De ce nu a func\u021bionat a\u0219a?<\/em><\/p>\n<p><\/p>\n<p>Avem o astfel de abordare \u00eenc\u00e2t toat\u0103 infrastructura este \u00eentr-un singur repository. Terraform, Puppet, toate scripturile legate de acest lucru sunt toate \u00eentr-un singur repository. Astfel, putem garanta c\u0103 modific\u0103rile incrementale sunt testate pe r\u00e2nd. Dac\u0103 ar fi fost o mul\u021bime de branch-uri, un astfel de proiect ar fi aproape imposibil de \u00eentre\u021binut. Trec 6 luni \u0219i devin at\u00e2t de diferite \u00eenc\u00e2t este pur \u0219i simplu o pedeaps\u0103. Aceasta este ceea ce am vrut s\u0103 evit \u00eenainte de refactorizare. <\/p>\n<p><\/p>\n<p><em>Adic\u0103, nu func\u021bioneaz\u0103?<\/em><\/p>\n<p><\/p>\n<p>Asta deloc nu func\u021bioneaz\u0103.<\/p>\n<p><\/p>\n<p>\u00cen branch am t\u0103iat slide-ul folderului. Adic\u0103, dac\u0103 facem c\u00e2te un stack de test pentru fiecare echip\u0103, de exemplu, echipa A - are folderul ei, echipa B - are folderul ei, atunci nici asta nu func\u021bioneaz\u0103. Am creat un cod unificat pentru mediu de testare, care a fost destul de flexibil pentru a se potrivi tuturor. Adic\u0103, am \u00eentre\u021binut un singur cod. <\/p>\n<p><\/p>\n<p><em>Salut! M\u0103 numesc Iura! Mul\u021bumesc pentru prezentare! Am o \u00eentrebare despre module. Vorbi\u021bi despre utilizarea modulelor. Cum rezolva\u021bi problema dac\u0103 un modul sufer\u0103 modific\u0103ri care nu sunt compatibile cu modific\u0103rile altcuiva? Face\u021bi vreo versiune pentru module sau \u00eencerca\u021bi s\u0103 adapta\u021bi totul pentru a corespunde ambelor cerin\u021be?<\/em><\/p>\n<p><\/p>\n<p>Aceasta este problema unei mari avalan\u0219e. Este ceea ce suferim atunci c\u00e2nd o modificare inofensiv\u0103 poate distruge o parte din infrastructur\u0103. \u0218i acest lucru va fi observat abia dup\u0103 un timp \u00eendelungat.<\/p>\n<p><\/p>\n<p><em>Adic\u0103, \u00een prezent nu este rezolvat\u0103 deloc?<\/em><\/p>\n<p><\/p>\n<p>Faci module universale. Evit\u0103 fulgii de z\u0103pad\u0103. \u0218i totul va func\u021biona. A doua jum\u0103tate a prezent\u0103rii este despre cum s\u0103 evi\u021bi acest lucru.<\/p>\n<p><\/p>\n<p><em>Bun\u0103 ziua! Mul\u021bumesc pentru prezentare! A\u0219 dori s\u0103 clarific. A r\u0103mas o mare problem\u0103 de fond pentru care am venit. \u00cen ce mod sunt integrate Puppet \u0219i distribuirea rolurilor?<\/em><\/p>\n<p><\/p>\n<p>User-data.<\/p>\n<p><\/p>\n<p><em>Adic\u0103, pur \u0219i simplu arunca\u021bi un fi\u0219ier \u0219i cumva ac\u021biona\u021bi pe baza lui?<\/em><\/p>\n<p><\/p>\n<p>User-data este o not\u0103, adic\u0103, atunci c\u00e2nd facem un clon al imaginii, un Daemon se ridic\u0103 \u0219i, \u00eencerc\u00e2nd s\u0103 se identifice, cite\u0219te nota c\u0103 este un load balancer.<\/p>\n<p><\/p>\n<p><em>Adic\u0103, este un proces separat care este delegat?<\/em><\/p>\n<p><\/p>\n<p>Nu noi l-am inventat. Noi doar \u00eel folosim. <\/p>\n<p><\/p>\n<p><em>Bun\u0103 ziua! Am o \u00eentrebare despre User-data. A\u021bi men\u021bionat c\u0103 exist\u0103 probleme, c\u0103 cineva ar putea s\u0103 transmit\u0103 informa\u021bii gre\u0219ite. Exist\u0103 vreo modalitate de stocare a user-data \u00een acela\u0219i Git, astfel \u00eenc\u00e2t s\u0103 fie \u00eentotdeauna clar la ce se refer\u0103 User-data?<\/em><\/p>\n<p><\/p>\n<p>Gener\u0103m User-data din template. Adic\u0103, acolo intr\u0103 un anumit num\u0103r de variabile. \u0218i Terraform genereaz\u0103 rezultatul final. A\u0219adar, nu po\u021bi pur \u0219i simplu s\u0103 te ui\u021bi la template \u0219i s\u0103 spui ce va ie\u0219i, deoarece toate problemele sunt legate de faptul c\u0103 dezvoltatorul crede c\u0103 transmite un \u0219ir \u00een aceast\u0103 variabil\u0103, dar intr\u0103 un array. \u0218i el se treze\u0219te cu \u2013 hop \u2013 c\u0103 este altceva, urm\u0103toarea linie, \u0219i totul s-a rupt. Dac\u0103 este o resurs\u0103 nou\u0103 \u0219i persoana o ridic\u0103, vede c\u0103 ceva nu func\u021bioneaz\u0103, atunci se rezolv\u0103 rapid. Dar dac\u0103 este un grup autoscale care s-a actualizat, atunci, la un moment dat, instan\u021bele din grupul autoscale \u00eencepe s\u0103 fie \u00eenlocuite. \u0218i, bum, ceva nu func\u021bioneaz\u0103. Este frustrant.<\/p>\n<p><\/p>\n<p><em>A\u0219adar, singura solu\u021bie este s\u0103 test\u0103m?<\/em><\/p>\n<p><\/p>\n<p>Da, vezi problema, adaugi pa\u0219i de testare. Adic\u0103 output-ul poate fi testat. Poate nu este at\u00e2t de convenabil, dar po\u021bi pune \u0219i unele etichete \u2013 verific\u0103 c\u0103 User-data este prins\u0103 aici cu cuie. <\/p>\n<p><\/p>\n<p><em>M\u0103 numesc Timur. E foarte grozav c\u0103 exist\u0103 prezent\u0103ri despre cum s\u0103 organizezi corect Terraform.<\/em><\/p>\n<p><\/p>\n<p>Nu am \u00eenceput \u00eenc\u0103.<\/p>\n<p><\/p>\n<p><em>Cred c\u0103 la urm\u0103toarea conferin\u021b\u0103, poate, va exista. Am o \u00eentrebare simpl\u0103. De ce codifici valorile \u00eentr-un modul separat, \u0219i nu folose\u0219ti tfvars? Adic\u0103, ce este mai bun \u00een modulul cu valori dec\u00e2t tfvars?<\/em><\/p>\n<p><\/p>\n<p>Adic\u0103, aici (slide: Production\/environment\/settings.tf) trebuie s\u0103 scriu: domain = variabil\u0103, domain vpcnetwork, variabil\u0103 vpcnetwork \u0219i stvars \u2013 a ob\u021bine acela\u0219i lucru?<\/p>\n<p><\/p>\n<p><em>Exact a\u0219a facem. Ne referim la modulul setting source, de exemplu.<\/em><\/p>\n<p><\/p>\n<p>Practic, este un tfvars. Tfvars este foarte convenabil \u00een mediu de testare. Am tfvars pentru instan\u021be mari \u0219i pentru cele mici. \u0218i am aruncat un fi\u0219ier \u00een folder. \u0218i am ob\u021binut ceea ce am dorit. C\u00e2nd dezvolt\u0103m infrastructura, vrem s\u0103 putem verifica \u0219i s\u0103 \u00een\u021belegem imediat totul. Dar a\u0219a trebuie s\u0103 ne uit\u0103m aici, apoi s\u0103 ne uit\u0103m \u00een tfvars.<\/p>\n<p><\/p>\n<p><em>Deci, vrei s\u0103 ai totul \u00eentr-un singur loc?<\/em><\/p>\n<p><\/p>\n<p>Da, tfvars este atunci c\u00e2nd ai un singur cod. \u0218i este folosit \u00een mai multe locuri diferite cu nuan\u021be diferite. Atunci ai aruncat tfvars \u0219i ai ob\u021binut nuan\u021bele tale. Iar noi \u2013 aceasta este infrastructura ca \u0219i cod \u00een forma sa pur\u0103. Te-ai uitat \u0219i ai \u00een\u021beles. <\/p>\n<p><\/p>\n<p><em>Bun\u0103 ziua! A\u021bi \u00eent\u00e2lnit astfel de situa\u021bii \u00een care furnizorul de cloud intervine \u00een ceea ce a\u021bi realizat cu Terraform? S\u0103 presupunem c\u0103 modific\u0103m meta-datele. Acolo sunt chei ssh. Iar Google tot timpul introduce meta-datele \u0219i cheile sale. \u0218i Terraform tot timpul raporteaz\u0103 c\u0103 are modific\u0103ri. Dup\u0103 fiecare execu\u021bie, chiar dac\u0103 nimic nu se schimb\u0103, el spune mereu c\u0103 va actualiza acest c\u00e2mp.<\/em><\/p>\n<p><\/p>\n<p>Cu cheile, dar \u2013 da, o parte din infrastructur\u0103 este afectat\u0103 de aceast\u0103 problem\u0103, adic\u0103 Terraform nu poate schimba nimic. Nici noi nu putem schimba nimic manual. Deocamdat\u0103 tr\u0103im cu asta.<\/p>\n<p><\/p>\n<p><em>A\u0219adar, a\u021bi \u00eent\u00e2mpinat asta, dar nu a\u021bi g\u0103sit solu\u021bii? Continu\u0103 s\u0103 fac\u0103 ceea ce face singur?<\/em><\/p>\n<p><\/p>\n<p>Din p\u0103cate, da. <\/p>\n<p><\/p>\n<p><em>Bun\u0103 ziua! M\u0103 numesc Starkov Stanislav. Mail.ru Group. Cum rezolva\u021bi problema gener\u0103rii tagului pe ..., cum \u00eel transmite\u021bi \u00een interior? \u00cen\u021beleg c\u0103 prin User \u2014 data, pentru a specifica numele gazdei, s\u0103 folosi\u021bi Puppet? \u0218i a doua parte a \u00eentreb\u0103rii. Cum rezolva\u021bi aceast\u0103 problem\u0103 la SG, adic\u0103 atunci c\u00e2nd genera\u021bi SG, o sut\u0103 de instan\u021be de acela\u0219i tip, cum le numi\u021bi corect?<\/em><\/p>\n<p><\/p>\n<p>Instan\u021bele care sunt foarte importante pentru noi le numim frumos. Cele care nu sunt necesare au o anex\u0103 care indic\u0103 c\u0103 sunt \u00eentr-o grup\u0103 autoscale. \u0218i, teoretic, acestea pot fi \u0219terse \u0219i ob\u021binem noi. <\/p>\n<p><\/p>\n<p>Referitor la problema cu tagul, nu este o problem\u0103, ci o sarcin\u0103. \u0218i tagurile sunt folosite foarte, foarte mult, deoarece infrastructura este mare \u0219i costisitoare. Trebuie s\u0103 monitoriz\u0103m unde se duc banii, prin urmare tagurile ne permit s\u0103 \u00een\u021belegem ce \u0219i unde s-au cheltuit. \u0218i, prin urmare, s\u0103 c\u0103ut\u0103m locurile unde se cheltuie prea mul\u021bi bani. <\/p>\n<p><\/p>\n<p>Despre ce altceva a fost \u00eentrebarea?<\/p>\n<p><\/p>\n<p><em>C\u00e2nd SG creeaz\u0103 o sut\u0103 de instan\u021be, trebuie s\u0103 le diferentiem cumva?<\/em><\/p>\n<p><\/p>\n<p>Nu, nu este necesar. Fiecare instan\u021b\u0103 are un agent care raporteaz\u0103 c\u0103 are o problem\u0103. Dac\u0103 agentul raporteaz\u0103, atunci agentul cunoa\u0219te despre el \u0219i, cel pu\u021bin, exist\u0103 un IP al s\u0103u. Se poate verifica. \u00cen al doilea r\u00e2nd, folosim Consul pentru Discovery, acolo unde nu avem Kubernetes. \u0218i Consul arat\u0103 \u0219i el IP-ul instan\u021bei.<\/p>\n<p><\/p>\n<p><em>A\u0219adar, v\u0103 orienta\u021bi pe IP, nu pe numele gazdei?<\/em><\/p>\n<p><\/p>\n<p>Este imposibil s\u0103 te orientezi dup\u0103 numele gazdei, adic\u0103 sunt foarte multe. Exist\u0103 identificatori de instan\u021b\u0103 \u2013 AE etc. Acesta poate fi g\u0103sit undeva, poate fi c\u0103utat. <\/p>\n<p><\/p>\n<p><em>Salut! Am \u00een\u021beles c\u0103 Terraform este o chestie bun\u0103, adaptat\u0103 pentru cloud.<\/em> <\/p>\n<p><\/p>\n<p>Nu doar. <\/p>\n<p><\/p>\n<p><em>Aceasta este \u00eentrebarea care m\u0103 intereseaz\u0103. Dac\u0103 decide\u021bi s\u0103 migra\u021bi, s\u0103 zicem, pe Bare Metal \u00een mas\u0103 cu toate instan\u021bele dvs.? Nu vor fi probleme? Sau va fi necesar s\u0103 folosi\u021bi alte produse, de exemplu, acela\u0219i Ansible men\u021bionat aici?<\/em><\/p>\n<p><\/p>\n<p>Ansible se refer\u0103 la altceva. Adic\u0103, Ansible func\u021bioneaz\u0103 atunci c\u00e2nd instan\u021ba a fost pornit\u0103. Pe c\u00e2nd Terraform func\u021bioneaz\u0103 \u00eenainte ca instan\u021ba s\u0103 fie pornit\u0103. Trecerea la Bare Metal \u2013 nu. <\/p>\n<p><\/p>\n<p><em>Acum nu este, dar va veni un business \u0219i va spune: \u00abHai\u00bb.<\/em><\/p>\n<p><\/p>\n<p>Trecerea la un alt cloud \u2013 da, dar aici este o poveste pu\u021bin diferit\u0103. Trebuie s\u0103 scriem cod Terraform astfel \u00eenc\u00e2t s\u0103 putem trece pe un alt cloud cu mai pu\u021bin efort. <\/p>\n<p><\/p>\n<p>Ini\u021bial, s-a pus aceast\u0103 sarcin\u0103, c\u0103 \u00eentreaga infrastructur\u0103 trebuie s\u0103 fie agnostic, adic\u0103 orice cloud ar trebui s\u0103 func\u021bioneze, dar \u00eentr-un anumit moment businessul a cedat \u0219i a spus: \u00abOk, \u00een urm\u0103torii N ani nu ne vom muta nic\u0103ieri, putem folosi serviciile de la Amazon\u00bb.<\/p>\n<p><\/p>\n<p>Terraform permite crearea de joburi Front-End, configurarea PagerDuty, documente de date etc. Are foarte multe extensii. Practic, poate controla \u00eentreaga lume.<\/p>\n<p><\/p>\n<p><em>Mul\u021bumesc pentru prezentare! De asemenea, eu folosesc Terraform de 4 ani. \u00cen etapa tranzi\u021biei la Terraform, la infrastructur\u0103, la descrierea declarativ\u0103, ne-am confruntat cu situa\u021bia \u00een care cineva f\u0103cea ceva manual, iar tu \u00eencercai s\u0103 faci un plan. \u0218i primeai o eroare. Cum aborda\u021bi astfel de probleme? Cum g\u0103si\u021bi resursele pierdute care au fost specificate?<\/em><\/p>\n<p><\/p>\n<p>\u00cen principal manual \u0219i prin observare, dac\u0103 vedem \u00een raport ceva ciudat, analiz\u0103m ce se \u00eent\u00e2mpl\u0103 acolo sau pur \u0219i simplu \u0219tergem. \u00cen general, pull requests sunt o practic\u0103 obi\u0219nuit\u0103. <\/p>\n<p><\/p>\n<p><em>Dac\u0103 exist\u0103 o eroare, face\u021bi rollback? A\u021bi \u00eencercat s\u0103 face\u021bi asta?<\/em><\/p>\n<p><\/p>\n<p>Nu, aceasta este decizia unei persoane \u00een momentul \u00een care vede problema.<\/p>\n<p>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/524712\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Terraform \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0435 best practices \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 AWS-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439. \u0422\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441. \u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u043a\u043e\u043f\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u043c \u0440\u0435\u0433\u0438\u043e\u043d\u0435. \u0418 Terraform-\u043a\u043e\u0434 \u043d\u0443\u0436\u043d\u043e \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043d\u043e\u0432\u044b\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043d\u0435\u0436\u0438\u043d\u043a\u0443. \u041c\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 Terraform \u0434\u043b\u044f \u0431\u043e\u0440\u044c\u0431\u044b \u0441 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":98124,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-98123","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=\"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\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens\" \/>\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\udd47\u041f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 Terraform \u0434\u043b\u044f \u0431\u043e\u0440\u044c\u0431\u044b \u0441 \u0445\u0430\u043e\u0441\u043e\u043c \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 \u0440\u0443\u0442\u0438\u043d\u043e\u0439. \u041c\u0430\u043a\u0441\u0438\u043c \u041a\u043e\u0441\u0442\u0440\u0438\u043a\u0438\u043d (Ixtens) | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens\" \/>\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=\"2020-10-24T12:42:52+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-11-17T22:58:49+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\udd47Modele \u00een Terraform pentru a combate haosul \u0219i rutina manual\u0103. Maxim Kostrykin (Ixtens) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens","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\udd47\u041f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 Terraform \u0434\u043b\u044f \u0431\u043e\u0440\u044c\u0431\u044b \u0441 \u0445\u0430\u043e\u0441\u043e\u043c \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 \u0440\u0443\u0442\u0438\u043d\u043e\u0439. \u041c\u0430\u043a\u0441\u0438\u043c \u041a\u043e\u0441\u0442\u0440\u0438\u043a\u0438\u043d (Ixtens) | ProHoster","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens","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":"2020-10-24T12:42:52+00:00","article:modified_time":"2020-11-17T22:58:49+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"98123","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":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:04:35","updated":"2022-09-29 03:09:38","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\/98123","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=98123"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/98123\/revisions"}],"predecessor-version":[{"id":164071,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/98123\/revisions\/164071"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/98124"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=98123"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=98123"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=98123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}