{"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\/pl\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens","title":{"rendered":"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/ec13125c702f42863bbe774cd805442b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wydawa\u0107 by si\u0119 mog\u0142o, \u017ce deweloperzy Terraform oferuj\u0105 wystarczaj\u0105co wygodne najlepsze praktyki do pracy z infrastruktur\u0105 AWS. Tylko jest jeden szczeg\u00f3\u0142. Z czasem liczba \u015brodowisk ro\u015bnie, ka\u017cde ma swoje szczeg\u00f3\u0142y. Pojawia si\u0119 praktycznie kopia stosu aplikacji w s\u0105siednim regionie. A kod Terraformu trzeba starannie skopiowa\u0107 i edytowa\u0107 zgodnie z nowymi wymaganiami lub zrobi\u0107 p\u0142atek \u015bniegu.<\/p>\n<p><\/p>\n<p>M\u00f3j wyk\u0142ad dotyczy wzorc\u00f3w w Terraform, kt\u00f3re pomagaj\u0105 w walce z chaosem i r\u0119cznymi czynno\u015bciami w du\u017cych, d\u0142ugoterminowych projektach.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Wideo:<\/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=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/8c67c45e486d6c03793dd08c33a16313.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mam 40 lat, 20 lat w IT. Pracuj\u0119 w firmie Ixtens od 12 lat. Zajmujemy si\u0119 rozwojem opartym na e-commerce. I od 5 lat praktykuj\u0119 praktyki DevOps.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/8b14b3adaa45d69278d76580baa99042.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Moja opowie\u015b\u0107 b\u0119dzie dotyczy\u0107 do\u015bwiadczenia w projekcie w firmie, kt\u00f3rej nazwy nie podam, powo\u0142uj\u0105c si\u0119 na umow\u0119 o poufno\u015bci. <\/p>\n<p><\/p>\n<p>Cyfry na slajdzie s\u0105 podane po to, aby zrozumie\u0107 skal\u0119 projektu. A wszystko, co dalej powiem, b\u0119dzie zwi\u0105zane z Amazonem.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/3742217a2abaf1fcf2163979d82eac14.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Do\u0142\u0105czy\u0142em do tego projektu 4 lata temu. I w chwili szczytowej przechodzi\u0142em przez refaktoryzacj\u0119 infrastruktury, poniewa\u017c projekt si\u0119 rozrasta\u0142. Wzorce, kt\u00f3re by\u0142y stosowane, ju\u017c nie pasowa\u0142y. I bior\u0105c pod uwag\u0119 ca\u0142y planowany wzrost projektu, trzeba by\u0142o wymy\u015bli\u0107 co\u015b nowego. <\/p>\n<p><\/p>\n<p>Dzi\u0119kuj\u0119 Matviejowi, kt\u00f3ry wczoraj opowiedzia\u0142, co dzia\u0142o si\u0119 w Dodo Pizzy. To, co dzia\u0142o si\u0119 u nas 4 lata temu. <\/p>\n<p><\/p>\n<p>Przyszli deweloperzy i zacz\u0119li pisa\u0107 kod infrastruktury. <\/p>\n<p><\/p>\n<p>Najbardziej oczywiste powody, dla kt\u00f3rych to by\u0142o konieczne, to potrzeba szybkiego wprowadzenia na rynek. Nale\u017ca\u0142o tak zorganizowa\u0107, aby zesp\u00f3\u0142 DevOps nie by\u0142 w\u0105skim gard\u0142em podczas wypuszczania. Opr\u00f3cz tego na samym pocz\u0105tku u\u017cywano Terraform i Puppet.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/13d6df6a324d2e1162acef77ca2ad0dc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Terraform to projekt open source firmy HashiCorp. A dla tych, kt\u00f3rzy w og\u00f3le nie wiedz\u0105, co to jest, kilka nast\u0119pnych slajd\u00f3w. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/61726d4205d1f4f8e449fe9d71507508.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Infrastruktura jako kod oznacza, \u017ce mo\u017cemy opisa\u0107 nasz\u0105 infrastruktur\u0119 i poprosi\u0107 jakie\u015b roboty, aby stworzy\u0142y zasoby, kt\u00f3re opisali\u015bmy.<\/p>\n<p><\/p>\n<p>Na przyk\u0142ad potrzebujemy <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/pl\/vps\/abuzoustojchivye-vps\/\"   title=\"maszyna wirtualna\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"4196\">maszyna wirtualna<\/a>. Opiszemy to, dodamy kilka obowi\u0105zkowych parametr\u00f3w. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/eb52c1e458fa092bba8577fffceb864c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nast\u0119pnie w konsoli skonfigurujemy dost\u0119p do Amazona. I poprosimy Terraform o plan. Terraform plan powie: \"Ok, dla Twojego zasobu mo\u017cemy zrobi\u0107 takie rzeczy\". I przynajmniej jeden zas\u00f3b zostanie dodany. I nie przewiduje si\u0119 \u017cadnych zmian. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/879e645596121ee5d05ac247b4be19ee.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Po tym, jak wszystko Ci\u0119 zadowoli, mo\u017cesz poprosi\u0107 Terraform o zastosowanie, a Terraform utworzy dla Ciebie instancj\u0119 i otrzymasz maszyn\u0119 wirtualn\u0105 w chmurze.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/77b7fe4d6abcc9116233f48caa887465.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nasz projekt si\u0119 rozwija. Dodajemy do niego r\u00f3\u017cne zmiany. Prosimy o dodatkowe instancje, dodajemy 53 wpisy.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/98ce7e1f9d1f85aa5e78c269a0708ac1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I powtarzamy. Prosimy o plan. Widzimy, jakie zmiany s\u0105 planowane. Wprowadzamy je. W ten spos\u00f3b nasza infrastruktura ro\u015bnie. <\/p>\n<p><\/p>\n<p>Terraform u\u017cywa tzw. plik\u00f3w stanu. To znaczy, \u017ce wszystkie zmiany, kt\u00f3re s\u0105 wysy\u0142ane do Amazonu, s\u0105 zapisywane w pliku, w kt\u00f3rym dla ka\u017cdego opisanego zasobu znajduj\u0105 si\u0119 odpowiadaj\u0105ce zasoby, kt\u00f3re zosta\u0142y utworzone w Amazonie. W ten spos\u00f3b, przy zmianie opisu jakiego\u015b zasobu, Terraform dok\u0142adnie wie, co nale\u017cy zmieni\u0107 w Amazonie.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/6e83efffb7af6ab967b4716be170b47b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Te pliki stanu pocz\u0105tkowo by\u0142y po prostu plikami. Przechowywali\u015bmy je w Gicie, co by\u0142o bardzo niewygodne. Kto\u015b zawsze zapomina\u0142 o zatwierdzeniu zmian, co prowadzi\u0142o do wielu konflikt\u00f3w. <\/p>\n<p><\/p>\n<p>Obecnie mo\u017cna u\u017cywa\u0107 backendu, tzn. Terraform wskazuje, w kt\u00f3rym koszyku i pod jakim kluczem nale\u017cy zapisa\u0107 plik stanu. Terraform sam zadba o to, by pobra\u0107 ten plik stanu, przeprowadzi\u0107 wszystkie operacje i z\u0142o\u017cy\u0107 z powrotem ostateczny wynik.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/e6687463a9fe3cff979f44ac7778b4e8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nasza infrastruktura ro\u015bnie. Oto nasz kod. Teraz nie chcemy tylko tworzy\u0107 maszyny wirtualnej, chcemy mie\u0107 \u015brodowisko testowe.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/0effb09fa04d3d520c1cdbb34ce97810.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Terraform pozwala na stworzenie modu\u0142u, tzn. mo\u017cna to samo opisa\u0107 w odpowiednim folderze.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/95c8395b10142fe550b0719161211f15.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na przyk\u0142ad, w testach mo\u017cna wywo\u0142a\u0107 ten modu\u0142 i uzyska\u0107 to samo, jakby\u015bmy wykonali Terraform apply w samym module. Kod do testowania b\u0119dzie wygl\u0105da\u0142 tak.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/fa4c16e3835a4507a858d2ddb767daf3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dla produkcji mo\u017cemy wys\u0142a\u0107 tam pewne zmiany, poniewa\u017c w testach nie potrzebujemy du\u017cych instancji, w produkcji du\u017ce instancje b\u0119d\u0105 bardzo przydatne.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/19478de23da2278567e66bacef78a0a9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Teraz wr\u00f3c\u0119 do projektu. By\u0142o to trudne zadanie, infrastruktura mia\u0142a by\u0107 bardzo du\u017ca. Konieczne by\u0142o umiejscowienie ca\u0142ego kodu w taki spos\u00f3b, aby by\u0142o to wygodne dla wszystkich: zar\u00f3wno dla os\u00f3b zajmuj\u0105cych si\u0119 utrzymaniem tego kodu, jak i dla tych, kt\u00f3rzy wprowadzaj\u0105 zmiany. Planowano, \u017ce ka\u017cdy programista mo\u017ce podej\u015b\u0107 i poprawi\u0107 infrastruktur\u0119 wed\u0142ug potrzeb swojej cz\u0119\u015bci platformy. <\/p>\n<p><\/p>\n<p>To drzewo katalog\u00f3w, kt\u00f3re jest zalecane przez sam\u0105 firm\u0119 HashiCorp, je\u015bli macie du\u017cy projekt i jest sens podzieli\u0107 ca\u0142\u0105 infrastruktur\u0119 na mniejsze kawa\u0142ki, a ka\u017cdy z nich opisa\u0107 w osobnym folderze. <\/p>\n<p><\/p>\n<p>Majac obszern\u0105 bibliotek\u0119 zasob\u00f3w mo\u017cna w testach i w produkcji wywo\u0142ywa\u0107 mniej wi\u0119cej to samo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/c30cdc3d3ce5441bc0ae4a485069dacc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>W naszym przypadku to nie do ko\u0144ca pasowa\u0142o, poniewa\u017c testowy stos dla deweloper\u00f3w lub do testowania musia\u0142 by\u0107 prostszy do uzyskania. Nie chcia\u0142o si\u0119 chodzi\u0107 po folderach i stosowa\u0107 je w odpowiedniej kolejno\u015bci, martwi\u0105c si\u0119, \u017ce baza zostanie uruchomiona, a potem zostanie uruchomiony instancja, kt\u00f3ra t\u0119 baz\u0119 wykorzystuje. Dlatego ca\u0142y test uruchamiano z jednego folderu. Tam wywo\u0142ywano te same modu\u0142y, ale wszystko odbywa\u0142o si\u0119 w jednym przebiegu.<\/p>\n<p><\/p>\n<p>Terraform dba o wszystkie zale\u017cno\u015bci. Zawsze tworzy zasoby w takiej kolejno\u015bci, aby mo\u017cna by\u0142o uzyska\u0107 adres IP, na przyk\u0142ad, z \u015bwie\u017co utworzonej instancji, i uzyska\u0107 ten adres IP w zapisie route53. <\/p>\n<p><\/p>\n<p>Poza tym platforma jest bardzo rozbudowana. Uruchomienie testowego stosu, nawet na godzin\u0119, nawet na 8 godzin \u2013 to do\u015b\u0107 drogie przedsi\u0119wzi\u0119cie. <\/p>\n<p><\/p>\n<p>Zautomatyzowali\u015bmy ten proces. Job Jenkins pozwala\u0142 na uruchamianie stosu. Nale\u017ca\u0142o tam uruchomi\u0107 pull request z zmianami, kt\u00f3re deweloper chcia\u0142 przetestowa\u0107, oraz wskaza\u0107 wszystkie potrzebne opcje, komponenty i rozmiary. Je\u015bli chcia\u0142 testowania wydajno\u015bci, m\u00f3g\u0142 wzi\u0105\u0107 wi\u0119cej instancji. Je\u015bli potrzebowa\u0142 tylko sprawdzi\u0107, czy formularz si\u0119 otwiera, m\u00f3g\u0142 go uruchomi\u0107 na minimalnych ustawieniach. M\u00f3g\u0142 r\u00f3wnie\u017c wskaza\u0107, czy potrzebny jest klaster, czy nie, itd. <\/p>\n<p><\/p>\n<p>Nast\u0119pnie Jenkins uruchamia\u0142 skrypt pow\u0142oki, kt\u00f3ry nieco modyfikowa\u0142 kod w folderze Terraform. Usuwa\u0142 niepotrzebne pliki, dodawa\u0142 potrzebne pliki. A potem jednym przebiegiem Terraform apply, stos by\u0142 uruchamiany. <\/p>\n<p><\/p>\n<p>A potem sz\u0142y ju\u017c inne kroki, w kt\u00f3re nie chc\u0119 si\u0119 zag\u0142\u0119bia\u0107. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/b288c0b320d8cb6e282db994bc1c1f43.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Z uwagi na to, \u017ce do testowania potrzebowali\u015bmy nieco wi\u0119cej opcji ni\u017c w produkcji, musieli\u015bmy tworzy\u0107 kopie modu\u0142\u00f3w, aby w tych kopiach doda\u0107 te funkcje, kt\u00f3re s\u0105 potrzebne tylko w testowaniu. <\/p>\n<p><\/p>\n<p>I tak si\u0119 sta\u0142o, \u017ce w testach chciano przetestowa\u0107 te zmiany, kt\u00f3re w ko\u0144cu trafi\u0105 do produkcji. Ale tak naprawd\u0119 testowano jedn\u0105 rzecz, a w produkcji stosowano nieco inn\u0105. Istnia\u0142a ma\u0142a rozbie\u017cno\u015b\u0107, \u017ce w produkcji wszystkie zmiany by\u0142y stosowane przez zesp\u00f3\u0142 operacyjny. Czasami zdarza\u0142o si\u0119, \u017ce zmiany, kt\u00f3re mia\u0142y przej\u015b\u0107 z test\u00f3w do produkcji, pozostawa\u0142y w innej wersji. <\/p>\n<p><\/p>\n<p>Opr\u00f3cz tego istnia\u0142 problem z dodawaniem nowej us\u0142ugi, kt\u00f3ra nieco r\u00f3\u017cni\u0142a si\u0119 od ju\u017c istniej\u0105cej. Zamiast modyfikowa\u0107 istniej\u0105cy modu\u0142, konieczne by\u0142o stworzenie jego kopii i wprowadzenie niezb\u0119dnych zmian. <\/p>\n<p><\/p>\n<p>W zasadzie Terraform to nie jest prawdziwy j\u0119zyk. To deklaracja. Je\u015bli musimy co\u015b zadeklarowa\u0107, to to deklarujemy. I to wszystko dzia\u0142a.<\/p>\n<p><\/p>\n<p>W pewnym momencie, gdy omawiano jeden z moich pull request\u00f3w, jeden z koleg\u00f3w powiedzia\u0142, \u017ce nie nale\u017cy mno\u017cy\u0107 \u015bnie\u017cynek. Zainteresowa\u0142em si\u0119, co ma na my\u015bli. Jest taki fakt naukowy, \u017ce na \u015bwiecie nie ma dw\u00f3ch identycznych \u015bnie\u017cynek, wszystkie si\u0119 od siebie nieco r\u00f3\u017cni\u0105. I gdy tylko to us\u0142ysza\u0142em, natychmiast poczu\u0142em ci\u0119\u017car kodu Terraform. Poniewa\u017c, gdy konieczne by\u0142o przechodzenie z wersji na wersj\u0119, Terraform wymaga\u0142 wprowadzenia breaking chain zmian, tzn. kod nie by\u0142 ju\u017c kompatybilny z nast\u0119pn\u0105 wersj\u0105. Konieczne by\u0142o z\u0142o\u017cenie pull requestu, kt\u00f3ry obejmowa\u0142 prawie po\u0142ow\u0119 plik\u00f3w w infrastrukturze, aby dostosowa\u0107 infrastruktur\u0119 do nast\u0119pnej wersji Terraform.<\/p>\n<p><\/p>\n<p>I po pojawieniu si\u0119 takiej \u015bnie\u017cynki, ca\u0142y kod Terraform, kt\u00f3ry mieli\u015bmy, stawa\u0142 si\u0119 wielk\u0105, wielk\u0105 kup\u0105 \u015bniegu. <\/p>\n<p><\/p>\n<p>Dla zewn\u0119trznego dewelopera, kt\u00f3ry dzia\u0142a poza operacjami, nie ma to du\u017cego znaczenia, poniewa\u017c z\u0142o\u017cy\u0142 pull request, jego zas\u00f3b uruchomi\u0142 si\u0119. I to wszystko, dalej nie jest to jego troska. Zesp\u00f3\u0142 DevOps, kt\u00f3ry dba o to, aby wszystko by\u0142o w porz\u0105dku, musi wprowadzi\u0107 wszystkie te zmiany. A koszty tych zmian znacznie wzrasta\u0142y z ka\u017cd\u0105 dodatkow\u0105 \u015bnie\u017cynk\u0105.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/d07039414027798861d1424bb2c686b6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jest taka historia o tym, jak student na seminarium rysuje kred\u0105 na tablicy dwa idealne okr\u0119gi. Nauczyciel dziwi si\u0119, jak uda\u0142o mu si\u0119 tak r\u00f3wno narysowa\u0107 bez cyrkla. Student odpowiada: \u201eBardzo prosto, przez dwa lata w armii kr\u0119ci\u0142em maszynk\u0119 do mi\u0119sa\u201d. <\/p>\n<p><\/p>\n<p>Z tych czterech lat, w kt\u00f3rych bior\u0119 udzia\u0142 w tym projekcie, przez oko\u0142o dwa lata zajmuj\u0119 si\u0119 Terraform. I oczywi\u015bcie mam pewne sztuczki, pewne porady, jak upro\u015bci\u0107 kod Terraform, pracowa\u0107 z nim jak z j\u0119zykiem programowania i zmniejszy\u0107 obci\u0105\u017cenie dla deweloper\u00f3w, kt\u00f3rzy musz\u0105 utrzymywa\u0107 ten kod w aktualnym stanie. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/9413c6adf1933482dcc822b021773df9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pierwsz\u0105 rzecz\u0105, od kt\u00f3rej chcia\u0142bym zacz\u0105\u0107, s\u0105 Symlinks. Terraform ma wiele powtarzaj\u0105cego si\u0119 kodu. Na przyk\u0142ad, wywo\u0142anie dostawcy praktycznie w ka\u017cdym miejscu, gdzie tworzymy kawa\u0142ek infrastruktury, jest takie samo. Dlatego logiczne jest wyodr\u0119bnienie go do osobnego folderu. A wsz\u0119dzie tam, gdzie potrzebny jest dostawca, tw\u00f3rzmy symlinki do tego pliku. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/6dcf36cc8c94e7a70cf6ab1456cc1215.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Przyk\u0142adowo, w produkcji u\u017cywacie assume role, kt\u00f3re pozwala wam uzyska\u0107 dost\u0119p do jakiego\u015b zewn\u0119trznego konta Amazon. Zmieniaj\u0105c jeden plik, wszystkie pozosta\u0142e w drzewie zasob\u00f3w b\u0119d\u0105 mia\u0142y wymagane uprawnienia, aby Terraform wiedzia\u0142, do kt\u00f3rego segmentu Amazon si\u0119 odwo\u0142a\u0107. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/6df9a89ef48ae9a7adda7fb1f86b76aa.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Gdzie symlinks nie dzia\u0142aj\u0105? Jak ju\u017c wspomnia\u0142em, w Terraformie s\u0105 pliki stanu. I s\u0105 one naprawd\u0119 super. Problem w tym, \u017ce Terraform inicjalizuje backend w pierwszej kolejno\u015bci. I nie mo\u017ce u\u017cywa\u0107 w tych parametrach \u017cadnych zmiennych, zawsze trzeba pisa\u0107 tekstem. <\/p>\n<p><\/p>\n<p>W rezultacie, gdy kto\u015b tworzy nowy zas\u00f3b, kopiuje cz\u0119\u015b\u0107 kodu z innych folder\u00f3w. Mo\u017ce pomyli\u0107 si\u0119 z kluczem lub bucketem. Na przyk\u0142ad, tworzy co\u015b w sandboxie, a potem robi w produkcji. I mo\u017ce si\u0119 okaza\u0107, \u017ce bucket w produkcji b\u0119dzie u\u017cywany z sandboxu. Oczywi\u015bcie, to szybko zauwa\u017c\u0105. Mo\u017cna to jako\u015b naprawi\u0107, ale mimo wszystko to strata czasu i w pewnym sensie zasob\u00f3w. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/757294dc6a1a27fc4a5fe174cc4aa7d7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Co mo\u017cemy zrobi\u0107 dalej? Przed rozpocz\u0119ciem pracy z Terraformem nale\u017cy go zainicjalizowa\u0107. W momencie inicjalizacji Terraform pobiera wszystkie wtyczki. W pewnym momencie z monolitu rozdzielono je na bardziej mikroserwisow\u0105 architektur\u0119. Zawsze trzeba wykona\u0107 Terraform init, aby pobra\u0142 wszystkie modu\u0142y i wtyczki.<\/p>\n<p><\/p>\n<p>Mo\u017cna u\u017cywa\u0107 skryptu shell, kt\u00f3ry, po pierwsze, mo\u017ce zebra\u0107 wszystkie zmienne. Skrypt shell jest nieograniczony. A po drugie, \u015bcie\u017cki. Je\u015bli zawsze u\u017cywamy tej samej \u015bcie\u017cki, kt\u00f3ra w repozytorium jest kluczem do pliku stanu, to b\u0142\u0105d w tym przypadku b\u0119dzie wykluczony. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/b70dbc6d8edb1b255c64d722a7e40680.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sk\u0105d zdoby\u0107 dane? Plik JSON. Terraform pozwala zapisywa\u0107 infrastruktur\u0119 nie tylko w hcl (HashiCorp Configuration Language), ale tak\u017ce w JSON.<\/p>\n<p><\/p>\n<p>JSON mo\u017cna \u0142atwo odczyta\u0107 ze skryptu shell. W zwi\u0105zku z tym, mo\u017cna umie\u015bci\u0107 plik konfiguracyjny z bucketem w jakim\u015b miejscu. I u\u017cywa\u0107 tego bucketu zar\u00f3wno w kodzie Terraform, jak i w skrypcie shell do inicjalizacji. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/a18b92cac763003ec49af8d4a37e19d9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dlaczego wa\u017cne jest posiadanie bucketu dla Terraform? Poniewa\u017c istnieje co\u015b takiego jak zdalne pliki stanu. T. j. kiedy uruchamiam jaki\u015b zas\u00f3b, musz\u0119 powiedzie\u0107 Amazonowi: \u201eProsz\u0119, uruchom instance\u201d, musz\u0119 wskaza\u0107 wiele obowi\u0105zkowych parametr\u00f3w. <\/p>\n<p><\/p>\n<p>I te identyfikatory s\u0105 przechowywane w jaki\u015b innych folderach. Mog\u0119 powiedzie\u0107: \u201eTerraform, pobiegnij, prosz\u0119, do pliku stanu tego zasobu i przynie\u015b mi te identyfikatory\u201d. W ten spos\u00f3b powstaje pewna unifikacja mi\u0119dzy r\u00f3\u017cnymi regionami czy \u015brodowiskami.<\/p>\n<p><\/p>\n<p>Nie zawsze mo\u017cna u\u017cywa\u0107 zdalnego pliku stanu. Na przyk\u0142ad, stworzy\u0142e\u015b VPC r\u0119cznie. A kod Terraform, kt\u00f3ry tworzy VPC, tworzy tak r\u00f3\u017cny VPC, \u017ce b\u0119dziesz musia\u0142 sp\u0119dzi\u0107 du\u017co czasu na dostosowywaniu jednego do drugiego, wi\u0119c mo\u017cna u\u017cy\u0107 nast\u0119puj\u0105cego podej\u015bcia. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/04ffcd97e2fae323d9b4d81e5f6c751a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>T. j. zrobi\u0107 modu\u0142, kt\u00f3ry jakby tworzy VPC i jakby zwraca ci identyfikatory, a tak naprawd\u0119 jest tylko plik z zakodowanymi warto\u015bciami, kt\u00f3ry mo\u017cna wykorzysta\u0107 do utworzenia tej samej instance.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/9cd878c459f377caf5af9bf27b026187.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nie zawsze trzeba przechowywa\u0107 plik stanu w chmurze. Na przyk\u0142ad, gdy testowane s\u0105 modu\u0142y, mo\u017cna u\u017cy\u0107 inicjalizacji backendu, kiedy plik b\u0119dzie przechowywany po prostu na dysku w czasie testowania.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/70fee8d4105cfddacafeec00825127b5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Teraz troch\u0119 o testowaniu. Co mo\u017cna testowa\u0107 w Terraform? Pewnie wiele, ale ja b\u0119d\u0119 m\u00f3wi\u0142 o tych 4 rzeczach.<\/p>\n<p><\/p>\n<p>HashiCorp ma zrozumienie, jak nale\u017cy formatowa\u0107 kod Terraform. I Terraform fmt pozwala ci sformatowa\u0107 kod, kt\u00f3ry edytujesz zgodnie z tym przekonaniem. Zatem testy musz\u0105 koniecznie sprawdzi\u0107, czy formatowanie odpowiada temu, co zostawi\u0142 HashiCorp, aby nie trzeba by\u0142o zmienia\u0107 po\u0142o\u017cenia nawias\u00f3w itd. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/bb99ffdd9f963f0f44ea7b5379689737.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nast\u0119pny to Terraform validate. On robi troch\u0119 wi\u0119cej ni\u017c sprawdzenie sk\u0142adni \u2013 czyli, czy wszystkie nawiasy s\u0105 parzyste. Co jest wa\u017cne? Nasza infrastruktura jest bardzo rozga\u0142\u0119ziona. Jest w niej bardzo wiele r\u00f3\u017cnych folder\u00f3w. I w ka\u017cdym z nich nale\u017cy uruchomi\u0107 Terraform validate.<\/p>\n<p><\/p>\n<p>Zatem, aby przyspieszy\u0107 testowanie, uruchamiamy kilka proces\u00f3w r\u00f3wnolegle, korzystaj\u0105c z r\u00f3wnoleg\u0142o\u015bci. <\/p>\n<p><\/p>\n<p>R\u00f3wnoleg\u0142o\u015b\u0107 to bardzo fajna rzecz, korzystajcie.<\/p>\n<p><\/p>\n<p>Jednak za ka\u017cdym razem, gdy inicjalizowany jest Terraform, udaje si\u0119 on do HashiCorp i pyta: \u201eJakie s\u0105 najnowsze wersje wtyczek? A ta wtyczka, kt\u00f3r\u0105 mam w pami\u0119ci podr\u0119cznej \u2013 jest ona aktualna czy nie?\u201d. I to na ka\u017cdym kroku powodowa\u0142o spowolnienie. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/836e90327c7a60c493f42f0a055e248b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Je\u015bli podamy Terraform informacj\u0119, gdzie znajduj\u0105 si\u0119 wtyczki, to powie: \u201eOk, prawdopodobnie to jest najnowsze, co mam. Nie b\u0119d\u0119 nigdzie chodzi\u0142, od razu zaczn\u0119 weryfikowa\u0107 tw\u00f3j kod Terraform.\u201d<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/8ab344cf8de7087d30a1212d44691c20.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aby zaopatrzy\u0107 folder w potrzebne wtyczki, mamy bardzo prosty kod Terraform, kt\u00f3ry wystarczy zainicjowa\u0107. Oczywi\u015bcie, nale\u017cy wskaza\u0107 wszystkich dostawc\u00f3w, kt\u00f3rzy bior\u0105 udzia\u0142 w twoim kodzie, w przeciwnym razie Terraform powie: \u201eNie znam tego dostawcy, poniewa\u017c go nie ma w pami\u0119ci podr\u0119cznej.\u201d<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/b8130753045624d38bce32ba08b56fb0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nast\u0119pnie \u2013 Terraform plan. Jak ju\u017c wspomnia\u0142em, rozw\u00f3j jest cykliczny. Tworzymy kod z zmianami. A potem trzeba dowiedzie\u0107 si\u0119, jakie zmiany s\u0105 planowane w infrastrukturze. <\/p>\n<p><\/p>\n<p>Gdy infrastruktura jest bardzo, bardzo du\u017ca, mo\u017cna zmieni\u0107 jeden modu\u0142, naprawi\u0107 jakie\u015b \u015brodowisko testowe lub konkretny region i zepsu\u0107 jak\u0105\u015b s\u0105siedni\u0105 cz\u0119\u015b\u0107. Dlatego Terraform plan powinien by\u0107 tworzony dla ca\u0142ej infrastruktury i pokazywa\u0107, jakie zmiany s\u0105 planowane.<\/p>\n<p><\/p>\n<p>Mo\u017cna to robi\u0107 w m\u0105dry spos\u00f3b. Na przyk\u0142ad napisali\u015bmy skrypt w Pythonie, kt\u00f3ry rozwi\u0105zuje zale\u017cno\u015bci. W zale\u017cno\u015bci od tego, co zosta\u0142o zmienione: modu\u0142 Terraform lub po prostu jaki\u015b konkretny komponent, tworzy plany dla wszystkich zale\u017cnych folder\u00f3w.<\/p>\n<p><\/p>\n<p>Terraform plan powinien by\u0107 wykonywany na \u017c\u0105danie. Przynajmniej to robimy my. <\/p>\n<p><\/p>\n<p>Testy, oczywi\u015bcie, warto robi\u0107 dla ka\u017cdej zmiany, ka\u017cdego commitu, ale plany \u2013 to do\u015b\u0107 kosztowna rzecz. I w pro\u015bbie o pull m\u00f3wimy: \u201eProsz\u0119, daj mi plany\u201d. Robot si\u0119 uruchamia. I przesy\u0142a w komentarzach lub za\u0142\u0105cznikach wszystkie plany, kt\u00f3re s\u0105 przewidziane na podstawie twoich zmian. <\/p>\n<p><\/p>\n<p>Plan to do\u015b\u0107 kosztowna rzecz. Zajmuje czas, poniewa\u017c Terraform udaje si\u0119 do Amazonu i pyta: \u201eCzy ten instance jeszcze istnieje? A te parametry autoskalowania s\u0105 na pewno takie same?\u201d. Aby to przyspieszy\u0107, mo\u017cna u\u017cy\u0107 takiego parametru, jak refresh=false. To oznacza, \u017ce Terraform wyci\u0105gnie stan z S3. I uwierzy, \u017ce stan b\u0119dzie dok\u0142adnie odpowiada\u0142 temu, co znajduje si\u0119 w Amazonie.<\/p>\n<p><\/p>\n<p>Taki plan Terraform przebiega znacznie szybciej, ale stan musi odpowiada\u0107 twojej infrastrukturze, tzn. gdzie\u015b, kiedy\u015b musi by\u0107 uruchomiony Terraform refresh. Terraform refresh robi dok\u0142adnie to, aby stan odpowiada\u0142 temu, co znajduje si\u0119 w rzeczywistej infrastrukturze. <\/p>\n<p><\/p>\n<p>I trzeba powiedzie\u0107 o bezpiecze\u0144stwie. Od tego trzeba by\u0142o zacz\u0105\u0107. Tam, gdzie uruchamiasz Terraform i Terraform pracuje z twoj\u0105 infrastruktur\u0105, istnieje luka. Tzn. w zasadzie wykonujesz kod. I je\u015bli pull request zawiera jaki\u015b z\u0142o\u015bliwy kod, to mo\u017ce on by\u0107 wykonany w infrastrukturze, kt\u00f3ra ma zbyt du\u017co dost\u0119pu. Dlatego b\u0105d\u017a ostro\u017cny, gdzie uruchamiasz Terraform plan.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/2153cc01acf2b1f46978f837b82b317e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nast\u0119pna rzecz, o kt\u00f3rej chcia\u0142bym m\u00f3wi\u0107, to testowanie user-data.<\/p>\n<p><\/p>\n<p>Czym jest user-data? W Amazonie, gdy tworzymy instancj\u0119, mo\u017cemy wys\u0142a\u0107 pewnego rodzaju wiadomo\u015b\u0107 \u2013 metadane. Kiedy instancja si\u0119 uruchamia, zwykle cloud init zawsze jest obecny na tych instancjach. Cloud init odczytuje t\u0119 wiadomo\u015b\u0107 i m\u00f3wi: \u201eOk, dzisiaj jestem load balancerem\u201d. I zgodnie z tymi obietnicami wykonuje pewne dzia\u0142ania.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/406ac9341e102f5e0d7ca239d10675cd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Niestety, gdy wykonujemy Terraform plan i Terraform apply, user-data wygl\u0105da jak taka kasza z cyfr. Tzn. on po prostu wysy\u0142a ci hasz. I wszystko, co mo\u017cesz zobaczy\u0107 w planie, to czy b\u0119d\u0105 jakie\u015b zmiany, czy hasz pozostanie ten sam. <\/p>\n<p><\/p>\n<p>I je\u015bli nie zwr\u00f3cisz na to uwagi, to na Amazonie na rzeczywist\u0105 infrastruktur\u0119 mo\u017ce trafi\u0107 jaki\u015b zepsuty plik tekstowy. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/cd7b56f1149d9cbebb0ad3228c0eeb5f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mo\u017cesz r\u00f3wnie\u017c przy wykonywaniu okre\u015bli\u0107 tylko template, a w kodzie powiedzie\u0107: \u201eProsz\u0119, wy\u015bwietl mi ten template\u201d. W rezultacie mo\u017cesz uzyska\u0107 wydruk, jak b\u0119d\u0105 wygl\u0105da\u0107 twoje dane na Amazonie.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/86da779cdf7f9cacfd80a196efde47f7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Inna opcja to u\u017cycie modu\u0142u do generowania user-data. Zastosujesz ten modu\u0142. Otrzymasz plik na dysku. Por\u00f3wnasz go z referencyjnym. I w ten spos\u00f3b, je\u015bli jaki\u015b junior zdecyduje si\u0119 nieco poprawi\u0107 user-data, to twoje testy powiedz\u0105: \u201eOk, tutaj i tutaj s\u0105 jakie\u015b zmiany \u2013 to w porz\u0105dku\u201d.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/7e69ec1b2c04710066d93ee48f872254.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nast\u0119pna rzecz, o kt\u00f3rej chcia\u0142bym m\u00f3wi\u0107, to Automate Terraform apply.<\/p>\n<p><\/p>\n<p>Oczywi\u015bcie, wystarczaj\u0105co przera\u017caj\u0105ce jest robienie Terraform apply w trybie automatycznym, poniewa\u017c, kto wie, jakie zmiany zosta\u0142y wprowadzone i jak mog\u0105 by\u0107 szkodliwe dla \u017cywej infrastruktury. <\/p>\n<p><\/p>\n<p>Dla \u015brodowiska testowego jest to ca\u0142kiem w porz\u0105dku. To znaczy, \u017ce zadanie, kt\u00f3re tworzy \u015brodowisko testowe, jest tym, czego potrzebuj\u0105 wszyscy deweloperzy. A takie wyra\u017cenie jak \u201eu mnie wszystko dzia\u0142a\u0142o\u201d \u2014 to nie jest zabawny mem, lecz dow\u00f3d na to, \u017ce osoba si\u0119 z tym przy\u0142o\u017cy\u0142a, uruchomi\u0142a stos, przeprowadzi\u0142a na nim jakie\u015b testy. I upewni\u0142a si\u0119, \u017ce wszystko jest w porz\u0105dku, m\u00f3wi\u0105c: \u201eOk, ten kod, kt\u00f3ry wypuszczam, zosta\u0142 przetestowany.\u201d<\/p>\n<p><\/p>\n<p>W \u015brodowisku produkcyjnym, sandbox i innych \u015brodowiskach, kt\u00f3re s\u0105 bardziej istotne dla biznesu, mo\u017cna bezpiecznie stosowa\u0107 niekt\u00f3re zasoby cz\u0119\u015bciowo, poniewa\u017c nie prowadzi to do sytuacji, w kt\u00f3rej kto\u015b umiera. To: grupy autoskalowania, grupy bezpiecze\u0144stwa, role, route53 i lista mo\u017ce by\u0107 ca\u0142kiem d\u0142uga. Ale obserwuj, co si\u0119 dzieje, czytaj raporty o automatycznych zastosowaniach. <\/p>\n<p><\/p>\n<p>Tam, gdzie stosowanie jest niebezpieczne lub budzi obawy, na przyk\u0142ad w przypadku zasob\u00f3w z persistent i baz danych, nale\u017cy uzyskiwa\u0107 raporty na temat tego, \u017ce w jakiej\u015b cz\u0119\u015bci infrastruktury s\u0105 niezastosowane zmiany. I in\u017cynier, ju\u017c pod nadzorem, uruchamia zadania, aby je zastosowa\u0107, albo robi to ze swojej konsoli. <\/p>\n<p><\/p>\n<p>W Amazonie istnieje co\u015b takiego jak Terminate protection. I mo\u017ce ona chroni\u0107 w niekt\u00f3rych przypadkach przed niepo\u017c\u0105danymi zmianami. To znaczy, \u017ce Terraform poszed\u0142 na Amazona i m\u00f3wi: \u201eMusz\u0119 zabi\u0107 ten instance, aby stworzy\u0107 inny.\u201d A Amazon m\u00f3wi: \u201ePrzykro mi, nie dzisiaj. Mamy w\u0142\u0105czon\u0105 ochron\u0119 przed usuni\u0119ciem.\u201d<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/9f4258d8688556829586a1e308f5a1e2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A wisienk\u0105 na torcie jest optymalizacja kodu. Kiedy pracujemy z kodem Terraform, musimy przekaza\u0107 do modu\u0142u bardzo du\u017c\u0105 liczb\u0119 parametr\u00f3w. To te parametry, kt\u00f3re s\u0105 niezb\u0119dne do stworzenia jakiego\u015b zasobu. A kod zamienia si\u0119 w du\u017c\u0105 list\u0119 parametr\u00f3w, kt\u00f3re trzeba przekaza\u0107 z modu\u0142u do modu\u0142u, z modu\u0142u do modu\u0142u, zw\u0142aszcza gdy modu\u0142y s\u0105 zagnie\u017cd\u017cone. <\/p>\n<p><\/p>\n<p>I to jest bardzo trudne do przeczytania. Trudno to podda\u0107 przegl\u0105dowi. I bardzo cz\u0119sto zdarza si\u0119, \u017ce niekt\u00f3re parametry przechodz\u0105 przegl\u0105d, a nie s\u0105 do ko\u0144ca tymi, kt\u00f3re s\u0105 potrzebne. A to kosztuje czas i pieni\u0105dze, aby p\u00f3\u017aniej to poprawi\u0107.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/ad7e8a91692212fda9f2561854b881c9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dlatego proponuj\u0119 u\u017cywa\u0107 czego\u015b takiego jak z\u0142o\u017cony parametr, kt\u00f3ry zawiera pewne drzewo warto\u015bci. To znaczy, \u017ce potrzebna jest jaka\u015b folder, w kt\u00f3rym wskazane s\u0105 wszystkie warto\u015bci, kt\u00f3re chcia\u0142by\u015b mie\u0107 w jakim\u015b \u015brodowisku.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/909632949eb30057bf86b116239d9077.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wywo\u0142uj\u0105c ten modu\u0142, mo\u017cna uzyska\u0107 drzewo, kt\u00f3re jest generowane w jednym wsp\u00f3lnym module, tzn. w wsp\u00f3lnym module, kt\u00f3ry dzia\u0142a identycznie dla ca\u0142ej infrastruktury.<\/p>\n<p><\/p>\n<p>W tym module mo\u017cna wykona\u0107 pewne obliczenia, korzystaj\u0105c z nowej funkcji w Terraform, jak\u0105 s\u0105 locals. A nast\u0119pnie jednym output\u2019em mo\u017cna zwr\u00f3ci\u0107 skomplikowany parametr, kt\u00f3ry mo\u017ce zawiera\u0107 hashe, tablice itp. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/25c14e0397f8d95c301e0dfe6ae761df.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na tym ko\u0144cz\u0105 si\u0119 wszystkie najlepsze znaleziska, kt\u00f3re mam. Chcia\u0142bym opowiedzie\u0107 anegdot\u0119 o Kolumbie. Kiedy szuka\u0142 pieni\u0119dzy na swoj\u0105 ekspedycj\u0119, by odkry\u0107 Indie (jak wtedy my\u015bla\u0142), nikt mu nie wierzy\u0142 i s\u0105dzono, \u017ce to niemo\u017cliwe. Wtedy powiedzia\u0142: \u201eZr\u00f3bcie tak, aby jajko nie upad\u0142o\u201d. Wszyscy bankierzy, bardzo bogaci i prawdopodobnie m\u0105drzy ludzie, starali si\u0119 w jaki\u015b spos\u00f3b postawi\u0107 jajko, a ono ci\u0105gle upada\u0142o. Wtedy Kolumb wzi\u0105\u0142 jajko, lekko na nie nacisn\u0105\u0142. Skorupka si\u0119 zgnie\u015bci\u0142a, a jajko pozosta\u0142o nieruchome. Powiedzieli: \u201eO, to zbyt proste!\u201d. A Kolumb odpowiedzia\u0142: \u201eTak, to zbyt proste. I kiedy odkryj\u0119 Indie, wszyscy b\u0119d\u0105 korzysta\u0107 z tej trasy handlowej.\u201d <\/p>\n<p><\/p>\n<p>To, co wam teraz opowiedzia\u0142em, to prawdopodobnie do\u015b\u0107 proste i trywialne rzeczy. I gdy o nich si\u0119 dowiesz i zaczynasz je u\u017cywa\u0107, to jest w porz\u0105dku. Wi\u0119c korzystajcie. A je\u015bli s\u0105 to dla was normalne rzeczy, to przynajmniej wiecie, jak postawi\u0107 jajko, aby nie upad\u0142o. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/37bf83d04b99f089f2319c8d2e8aaeb4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Podsumujmy: <\/p>\n<p><\/p>\n<ul>\n<li>Staraj si\u0119 unika\u0107 \u015bnie\u017cynek. Im mniej \u015bnie\u017cynek, tym mniej zasob\u00f3w potrzebujesz, aby wprowadza\u0107 zmiany w ca\u0142ej swojej du\u017cej infrastrukturze. <\/li>\n<li>Ci\u0105g\u0142e zmiany. Tzn. gdy w kodzie zasz\u0142y jakie\u015b zmiany, nale\u017cy jak najszybciej dostosowa\u0107 swoj\u0105 infrastruktur\u0119 do tych zmian. Nie mo\u017ce by\u0107 sytuacji, aby kto\u015b po dw\u00f3ch-trzech miesi\u0105cach przyszed\u0142, by sprawdzi\u0107 Elasticsearch, zrobi\u0142 Terraform plan, a tam by\u0142a masa zmian, kt\u00f3rych si\u0119 nie spodziewa\u0142. I po\u015bwi\u0119ca si\u0119 bardzo du\u017co czasu, aby przywr\u00f3ci\u0107 wszystko do porz\u0105dku. <\/li>\n<li>Testy i automatyzacja. Im wi\u0119cej twojego kodu jest obj\u0119tego testami i funkcjami, tym wi\u0119ksza pewno\u015b\u0107, \u017ce wszystko robisz poprawnie. A automatyczna dostawa wielokrotnie zwi\u0119kszy twoj\u0105 pewno\u015b\u0107. <\/li>\n<li>Kod dla \u015brodowiska testowego i produkcyjnego powinien by\u0107 praktycznie identyczny. Praktycznie, poniewa\u017c jednak produkcja jest troch\u0119 inna i zawsze b\u0119d\u0105 jakie\u015b niuanse, kt\u00f3re wykraczaj\u0105 poza \u015brodowisko testowe. Niemniej jednak, mo\u017cna to zapewni\u0107 z pewnym marginesem. <\/li>\n<li>Je\u015bli macie du\u017co kodu Terraform, a utrzymanie go w aktualnym stanie zajmuje du\u017co czasu, nigdy nie jest za p\u00f3\u017ano na refaktoryzacj\u0119 i doprowadzenie go do dobrej formy. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/68f3946536f44eed33939b234fb3ca0d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Niezmienna infrastruktura. Dostarczanie AMI wed\u0142ug harmonogramu. <\/li>\n<li>Struktura dla route53, gdy macie wiele rekord\u00f3w i chcecie, aby by\u0142y uporz\u0105dkowane w spos\u00f3b sp\u00f3jny. <\/li>\n<li>Walcz\u0105c z ograniczeniami API rate limits. To wtedy Amazon m\u00f3wi: \u201eDo\u015b\u0107, nie mog\u0119 ju\u017c przyjmowa\u0107 wi\u0119cej zapyta\u0144, prosz\u0119 poczeka\u0107\u201d. I po\u0142owa firmy czeka, a\u017c b\u0119dzie mog\u0142a uruchomi\u0107 swoj\u0105 infrastruktur\u0119. <\/li>\n<li>Instancje ratunkowe. Amazon to nie jest tania zabawa, a spoty pozwalaj\u0105 zaoszcz\u0119dzi\u0107 spor\u0105 sum\u0119. Mo\u017cna o tym m\u00f3wi\u0107 przez ca\u0142y wyk\u0142ad. <\/li>\n<li>Bezpiecze\u0144stwo i role IAM. <\/li>\n<li>Wyszukiwanie zagubionych zasob\u00f3w, gdy macie w Amazone instancje o nieznanym pochodzeniu, kt\u00f3re konsumuj\u0105 pieni\u0105dze. Nawet je\u015bli instancja kosztuje 100-150 dolar\u00f3w miesi\u0119cznie \u2013 w skali roku to ponad 1 000. Wyszukiwanie takich zasob\u00f3w to korzystna sprawa. <\/li>\n<li>I zarezerwowane instancje. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Wzorce w Terraform do walki z chaosem i r\u0119czn\u0105 rutyn\u0105. Maksym Kostrikin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/69ddbf4c726bcc15aea1a1e2d67a3fc8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na tym ko\u0144cz\u0119. Terraform to naprawd\u0119 \u015bwietna rzecz, korzystajcie. Dzi\u0119kuj\u0119!<\/p>\n<p><\/p>\n<p>Pytania<\/p>\n<p><\/p>\n<p><em>Dzi\u0119kuj\u0119 za prezentacj\u0119! Macie plik stanu w S3, a jak rozwi\u0105zujecie problem, \u017ce kilka os\u00f3b mo\u017ce wzi\u0105\u0107 ten plik stanu i pr\u00f3bowa\u0107 si\u0119 rozwin\u0105\u0107?<\/em><\/p>\n<p><\/p>\n<p>Po pierwsze, nie spieszymy si\u0119. Po drugie, istniej\u0105 flagi, w kt\u00f3rych informujemy, \u017ce pracujemy nad jakim\u015b fragmentem kodu. To znaczy, \u017ce mimo i\u017c infrastruktura jest bardzo du\u017ca, nie oznacza to, \u017ce stale kto\u015b co\u015b wdra\u017ca. Kiedy by\u0142a aktywna faza \u2013 to by\u0142 problem, mieli\u015bmy pliki stanu w Gicie. To by\u0142o wa\u017cne, inaczej kto\u015b obs\u0142u\u017cy\u0142by plik stanu, i musieli\u015bmy r\u0119cznie je zbiera\u0107 w jednym miejscu, aby wszystko mog\u0142o dalej trwa\u0107. Teraz takiego problemu nie ma. W og\u00f3le, Terraform rozwi\u0105za\u0142 ten problem. A je\u015bli co\u015b si\u0119 stale zmienia, mo\u017cna u\u017cywa\u0107 blokad, kt\u00f3re zapobiegaj\u0105 tym problemom.<\/p>\n<p><\/p>\n<p><em>U\u017cywacie wersji otwartej czy enterprise?<\/em><\/p>\n<p><\/p>\n<p>\u017badnego enterprise, to znaczy wszystko, co mo\u017cna pobra\u0107 za darmo. <\/p>\n<p><\/p>\n<p><em>Nazywam si\u0119 Stanis\u0142aw. Chcia\u0142em doda\u0107 ma\u0142e uzupe\u0142nienie. M\u00f3wi\u0142e\u015b o funkcji Amazon, kt\u00f3ra pozwala na stworzenie niezniszczalnego instance. To jest r\u00f3wnie\u017c dost\u0119pne w samym Terraformie; w bloku Life Second mo\u017cna zdefiniowa\u0107 zakaz zmian lub zakaz usuni\u0119cia.<\/em> <\/p>\n<p><\/p>\n<p>Czas by\u0142 ograniczony. Dobre spostrze\u017cenie. <\/p>\n<p><\/p>\n<p><em>Chcia\u0142em zapyta\u0107 o dwie rzeczy. Po pierwsze, m\u00f3wi\u0142e\u015b o testowaniu. Czy korzysta\u0142e\u015b z jakich\u015b narz\u0119dzi do testowania? S\u0142ysza\u0142em o wtyczce Test Kitchen. Mo\u017ce jest co\u015b jeszcze. I chcia\u0142bym jeszcze zapyta\u0107 o Local Values. Czym one si\u0119 w zasadzie r\u00f3\u017cni\u0105 od Input Variables? I dlaczego nie mog\u0119 parametryzowa\u0107 czego\u015b tylko przez Local Values? Pr\u00f3bowa\u0142em zrozumie\u0107 ten temat, ale jako\u015b mi to nie wysz\u0142o.<\/em><\/p>\n<p><\/p>\n<p>Mo\u017cemy porozmawia\u0107 o tym bardziej szczeg\u00f3\u0142owo poza t\u0105 sal\u0105. Narz\u0119dzia do testowania mamy na w\u0142asn\u0105 r\u0119k\u0119. Nie ma tam nic, co mogliby\u015bmy przetestowa\u0107. W og\u00f3le s\u0105 opcje, kiedy automatyczne testy uruchamiaj\u0105 infrastruktur\u0119, sprawdzaj\u0105, czy wszystko jest w porz\u0105dku, a potem wszystko niszcz\u0105 z raportem, \u017ce twoja infrastruktura wci\u0105\u017c jest w dobrej kondycji. U nas tego nie ma, poniewa\u017c testowe stosy uruchamiaj\u0105 si\u0119 codziennie. I to wystarcza. A je\u015bli co\u015b zaczyna si\u0119 psu\u0107, to zacznie si\u0119 psu\u0107 niezale\u017cnie od tego, czy to jeszcze gdzie\u015b sprawdzimy. <\/p>\n<p><\/p>\n<p>Odno\u015bnie Local Values, kontynuujmy rozmow\u0119 poza sal\u0105. <\/p>\n<p><\/p>\n<p><em>Cze\u015b\u0107! Dzi\u0119kuj\u0119 za prezentacj\u0119! Bardzo pouczaj\u0105ce. M\u00f3wi\u0142e\u015b, \u017ce macie bardzo du\u017co jednorodnego kodu do opisu infrastruktury. Czy nie rozwa\u017cali\u015bcie mo\u017cliwo\u015bci generowania tego kodu?<\/em><\/p>\n<p><\/p>\n<p>\u015awietne pytanie, dzi\u0119kuj\u0119! Chodzi o to, \u017ce gdy u\u017cywamy infrastruktury jako kodu, zak\u0142adamy, \u017ce patrzymy na kod i rozumiemy, jaka infrastruktura za tym kodem stoi. Je\u015bli kod jest generowany, musimy wyobrazi\u0107 sobie, jaki kod zostanie wygenerowany, aby zrozumie\u0107, jaka infrastruktura si\u0119 tam znajduje. Albo generujemy kod, commitujemy go i w\u0142a\u015bciwie wychodzi to samo. Dlatego poszli\u015bmy tym krokiem, jak to napisali\u015bmy, to otrzymali\u015bmy. Poza tym generatory pojawi\u0142y si\u0119 nieco p\u00f3\u017aniej, gdy zacz\u0119li\u015bmy dzia\u0142a\u0107. Ju\u017c by\u0142o za p\u00f3\u017ano na zmiany.<\/p>\n<p><\/p>\n<p><em>S\u0142ysza\u0142e\u015b co\u015b o jsonnet?<\/em><\/p>\n<p><\/p>\n<p>Nie. <\/p>\n<p><\/p>\n<p><em>Zobacz, to naprawd\u0119 \u015bwietna rzecz. Widz\u0119 konkretny przypadek, w kt\u00f3rym mo\u017cna to zastosowa\u0107 i generowa\u0107 struktur\u0119 danych.<\/em> <\/p>\n<p><\/p>\n<p>Generatory s\u0105 dobre, kiedy masz sytuacj\u0119 jak w dowcipie o maszynie do golenia. To znaczy, za pierwszym razem twarz jest r\u00f3\u017cna, ale potem wszyscy maj\u0105 t\u0119 sam\u0105 twarz. Generatory bardzo dobrze si\u0119 sprzedaj\u0105. Ale niestety, mamy troch\u0119 r\u00f3\u017cne twarze. To jest problem. <\/p>\n<p><\/p>\n<p><em>Po prostu sp\u00f3jrz. Dzi\u0119kuj\u0119!<\/em><\/p>\n<p><\/p>\n<p><em>Mam na imi\u0119 Maksym, jestem z Sberbanku. Troch\u0119 opowiedzia\u0142e\u015b, \u017ce pr\u00f3bowa\u0142e\u015b dostosowa\u0107 Terraform do analogii j\u0119zyka programowania. Nie pro\u015bciej korzysta\u0107 z Ansible?<\/em><\/p>\n<p><\/p>\n<p>To bardzo r\u00f3\u017cne rzeczy. Mo\u017cna i w Ansible tworzy\u0107 zasoby, i Puppet mo\u017ce tworzy\u0107 zasoby w Amazonie. Ale Terraform jest do tego doskonale przystosowany. <\/p>\n<p><\/p>\n<p><em>Macie tylko Amazon?<\/em><\/p>\n<p><\/p>\n<p>Chodzi nie o to, \u017ce mamy tylko Amazon. Mamy prawie tylko Amazon. Ale kluczow\u0105 cech\u0105 jest to, \u017ce Terraform pami\u0119ta. W Ansible, je\u015bli powiesz: \u201eUtw\u00f3rz mi 5 instancji\u201d, to utworzy, a potem m\u00f3wisz: \u201eA teraz potrzebuj\u0119 3\u201d. I Terraform powie: \u201eOk, 2 usun\u0119\u201d, a Ansible powie: \u201eOk, oto 3\u201d. W sumie 8.<\/p>\n<p><\/p>\n<p><em>Cze\u015b\u0107! Dzi\u0119kuj\u0119 za twoje wyst\u0105pienie! Bardzo interesuj\u0105co by\u0142o pos\u0142ucha\u0107 o Terraformie. Od razu chcia\u0142bym doda\u0107 ma\u0142y komentarz na temat tego, \u017ce Terraform wci\u0105\u017c nie ma stabilnej wersji, dlatego z du\u017c\u0105 ostro\u017cno\u015bci\u0105 podchod\u017acie do Terraformu.<\/em><\/p>\n<p><\/p>\n<p>Dobrze mie\u0107 \u0142y\u017ck\u0119 do obiadu. To znaczy, je\u015bli potrzebujesz rozwi\u0105zania, to czasami odk\u0142adasz to, co jest niestabilne itd., ale dzia\u0142a i nam pomog\u0142o. <\/p>\n<p><\/p>\n<p><em>Pytanie takie. U\u017cywacie Remote backend, u\u017cywacie S3. Dlaczego nie u\u017cywacie oficjalnego backendu?<\/em><\/p>\n<p><\/p>\n<p>Oficjalnego?<\/p>\n<p><\/p>\n<p><em>Terraform Cloud.<\/em><\/p>\n<p><\/p>\n<p>Kiedy si\u0119 pojawi\u0142?<\/p>\n<p><\/p>\n<p><em>4 miesi\u0105ce temu.<\/em> <\/p>\n<p><\/p>\n<p>Gdyby pojawi\u0142 si\u0119 4 lata temu, to pewnie odpowiedzia\u0142bym na twoje pytanie.<\/p>\n<p><\/p>\n<p><em>Tam jest ju\u017c wbudowana funkcja i blokady, i mo\u017cna przechowywa\u0107 plik stanie. Spr\u00f3buj. Ale te\u017c tego nie testowa\u0142em.<\/em><\/p>\n<p><\/p>\n<p>Podr\u00f3\u017cujemy du\u017cym poci\u0105giem, kt\u00f3ry jedzie z du\u017c\u0105 pr\u0119dko\u015bci\u0105. I nie mo\u017cna po prostu wzi\u0105\u0107 i wyrzuci\u0107 kilku wagon\u00f3w. <\/p>\n<p><\/p>\n<p><em>M\u00f3wi\u0142e\u015b o \u015bnie\u017cynkach, a dlaczego nie u\u017cyli\u015bcie bran\u017cy? Dlaczego nie uda\u0142o si\u0119 tak zrobi\u0107?<\/em><\/p>\n<p><\/p>\n<p>Mamy takie podej\u015bcie, \u017ce ca\u0142a infrastruktura jest w jednym repozytorium. Terraform, Puppet, wszystkie skrypty, kt\u00f3re jako\u015b si\u0119 do tego odnosz\u0105, s\u0105 w jednym repozytorium. W ten spos\u00f3b mo\u017cemy zapewni\u0107, \u017ce zmiany inkrementalne s\u0105 testowane jedna po drugiej. Gdyby by\u0142o wiele ga\u0142\u0119zi, taki projekt by\u0142by praktycznie niemo\u017cliwy do utrzymania. Mijaj\u0105 p\u00f3\u0142 roku, a one \u05de\u05d0\u05d5\u05d3 si\u0119 rozchodz\u0105, \u017ce to po prostu jakie\u015b ukaranie. To jest to, od czego chcieli\u015bmy ucieka\u0107 przed refaktoryzacj\u0105. <\/p>\n<p><\/p>\n<p><em>To znaczy, to nie dzia\u0142a?<\/em><\/p>\n<p><\/p>\n<p>To w og\u00f3le nie dzia\u0142a.<\/p>\n<p><\/p>\n<p>W branchu usun\u0105\u0142em slajd folderu. Tzn. je\u015bli zrobimy dla ka\u017cdego testowego stosu, na przyk\u0142ad, zesp\u00f3\u0142 A \u2013 ma sw\u00f3j folder, zesp\u00f3\u0142 B ma sw\u00f3j folder, to r\u00f3wnie\u017c nie dzia\u0142a. Stworzyli\u015bmy zunifikowany kod \u015brodowiska testowego, kt\u00f3ry by\u0142 wystarczaj\u0105co elastyczny, aby pasowa\u0107 do wszystkich. Tzn. obs\u0142ugiwali\u015bmy jeden kod. <\/p>\n<p><\/p>\n<p><em>Cze\u015b\u0107! Nazywam si\u0119 Jura! Dzi\u0119kuj\u0119 za prezentacj\u0119! Pytanie dotycz\u0105ce modu\u0142\u00f3w. M\u00f3wicie, \u017ce u\u017cywacie modu\u0142\u00f3w. Jak rozwi\u0105zujecie problem, je\u015bli w jednym module wprowadzone s\u0105 zmiany, kt\u00f3re nie s\u0105 zgodne z zamianami innej osoby? W jaki\u015b spos\u00f3b wersjonujecie modu\u0142y, czy pr\u00f3bujecie dostosowa\u0107 wun\u00adderwa\u00adfl\u0119, aby spe\u0142ni\u0107 dwa wymagania?<\/em><\/p>\n<p><\/p>\n<p>To problem du\u017cej kuli \u015bnie\u017cnej. To, czego do\u015bwiadczamy, gdy jakie\u015b niegro\u017ane zmiany mog\u0105 z\u0142ama\u0107 cz\u0119\u015b\u0107 infrastruktury. I to b\u0119dzie zauwa\u017calne dopiero po d\u0142u\u017cszym czasie.<\/p>\n<p><\/p>\n<p><em>Tzn. na razie nic si\u0119 nie rozwi\u0105zuje?<\/em><\/p>\n<p><\/p>\n<p>Robicie uniwersalne modu\u0142y. Unikajcie p\u0142atk\u00f3w \u015bniegu. I wszystko b\u0119dzie w porz\u0105dku. Druga po\u0142owa prezentacji jest o tym, jak to unikn\u0105\u0107.<\/p>\n<p><\/p>\n<p><em>Dzie\u0144 dobry! Dzi\u0119kuj\u0119 za prezentacj\u0119! Chcia\u0142bym dopyta\u0107. Za kulisami zosta\u0142a du\u017ca kupa, dla kt\u00f3rej przyszed\u0142em. W jaki spos\u00f3b zintegrowane s\u0105 Puppet i przydzielanie r\u00f3l?<\/em><\/p>\n<p><\/p>\n<p>User-data.<\/p>\n<p><\/p>\n<p><em>Tzn. po prostu wyrzucacie plik i jako\u015b go wykonujecie?<\/em><\/p>\n<p><\/p>\n<p>User-data \u2013 to notatka, tzn. kiedy robimy klon obrazu, to uruchamia si\u0119 Daemon i pr\u00f3buj\u0105c zrozumie\u0107, kim jest, czyta notatk\u0119, \u017ce jest load balancerem.<\/p>\n<p><\/p>\n<p><em>Tzn. to jaki\u015b oddzielny proces, kt\u00f3ry jest przekazywany?<\/em><\/p>\n<p><\/p>\n<p>Nie my go wynale\u017ali\u015bmy. Korzystamy z niego. <\/p>\n<p><\/p>\n<p><em>Dzie\u0144 dobry! Mam pytanie dotycz\u0105ce User-data. Powiedzieli\u015bcie, \u017ce s\u0105 problemy, \u017ce kto\u015b mo\u017ce co\u015b nie tam przekaza\u0107. Czy jest jaki\u015b spos\u00f3b przechowywania user-data w tym samym Gicie, aby zawsze by\u0142o jasne, do czego odnosi si\u0119 User-data?<\/em><\/p>\n<p><\/p>\n<p>Generujemy User-data z template. To znaczy, \u017ce pojawia si\u0119 tam pewna liczba zmiennych. A Terraform generuje ostateczny wynik. Dlatego nie mo\u017cna po prostu spojrze\u0107 na template i powiedzie\u0107, co wyjdzie, poniewa\u017c wszystkie problemy s\u0105 zwi\u0105zane z tym, \u017ce deweloper my\u015bli, \u017ce przekazuje tam ci\u0105g, a tam przychodzi tablica. I ma \u2013 bum i ja \u2013 ten, ten, nast\u0119pny ci\u0105g, i wszystko si\u0119 rozpad\u0142o. Je\u015bli to jest nowy zas\u00f3b i osoba go uruchamia, widzi, \u017ce co\u015b nie dzia\u0142a, to szybko mo\u017cna to rozwi\u0105za\u0107. A je\u015bli zaktualizowa\u0142a si\u0119 grupa autoscale, to w pewnym momencie instancje w grupie autoscale zaczynaj\u0105 si\u0119 zamienia\u0107. I hop, co\u015b nie dzia\u0142a. To jest frustruj\u0105ce.<\/p>\n<p><\/p>\n<p><em>Czyli jedynym rozwi\u0105zaniem jest testowanie?<\/em><\/p>\n<p><\/p>\n<p>Tak, widzisz problem, dodajesz tam kroki testowe. To znaczy, \u017ce r\u00f3wnie\u017c output mo\u017cna testowa\u0107. Mo\u017ce nie jest to tak wygodne, ale mo\u017cna te\u017c postawi\u0107 jakie\u015b znaczniki \u2013 sprawdzaj, czy User-data jest tu przybita gwo\u017adziami. <\/p>\n<p><\/p>\n<p><em>Mam na imi\u0119 Timur. Bardzo fajnie, \u017ce s\u0105 prezentacje o tym, jak poprawnie organizowa\u0107 Terraform.<\/em><\/p>\n<p><\/p>\n<p>Nawet jeszcze nie zacz\u0105\u0142em.<\/p>\n<p><\/p>\n<p><em>My\u015bl\u0119, \u017ce na nast\u0119pnej konferencji, mo\u017ce by\u0107. Mam proste pytanie. Dlaczego hardcodujesz warto\u015b\u0107 w oddzielnym module, zamiast u\u017cywa\u0107 tfvars, to znaczy, czym lepszy modu\u0142 z warto\u015bciami, ni\u017c tfvars?<\/em><\/p>\n<p><\/p>\n<p>To znaczy, \u017ce musz\u0119 tutaj (slajd: Production\/environment\/settings.tf) napisa\u0107: domain = zmienna, domain vpcnetwork, zmienna vpcnetwork i stvars \u2013 wyci\u0105gn\u0105\u0107 to samo?<\/p>\n<p><\/p>\n<p><em>Robimy to dok\u0142adnie tak samo. Odwo\u0142ujemy si\u0119 do modu\u0142u setting source, na przyk\u0142ad.<\/em><\/p>\n<p><\/p>\n<p>W istocie to taki tfvars. Tfvars jest bardzo wygodny w \u015brodowisku testowym. Mam tfvars dla du\u017cych instancji, dla ma\u0142ych. I wrzuci\u0142em jeden plik do folderu. I otrzyma\u0142em to, co chcia\u0142em. Kiedy budujemy infrastruktur\u0119, chcemy, \u017ceby mo\u017cna by\u0142o spojrze\u0107 i od razu wszystko zrozumie\u0107. A tak to wychodzi, \u017ce trzeba spojrze\u0107 tutaj, potem spojrze\u0107 w tfvars.<\/p>\n<p><\/p>\n<p><em>Czyli, \u017ceby wszystko by\u0142o w jednym miejscu?<\/em><\/p>\n<p><\/p>\n<p>Tak, tfvars \u2013 to wtedy, gdy masz jeden kod. I jest on u\u017cywany w kilku r\u00f3\u017cnych miejscach z r\u00f3\u017cnymi niuansami. Wtedy wrzuci\u0142by\u015b tfvars i uzyska\u0142 swoje niuanse. A my \u2013 to infrastruktura jako kod w czystej postaci. Spojrza\u0142e\u015b i zrozumia\u0142e\u015b. <\/p>\n<p><\/p>\n<p><em>Cze\u015b\u0107! Czy zdarza\u0142y si\u0119 Wam sytuacje, w kt\u00f3rych dostawca chmury ingerowa\u0142 w to, co zrobili\u015bcie za pomoc\u0105 Terraform? Za\u0142\u00f3\u017cmy, \u017ce edytujemy metadane. S\u0105 tam klucze ssh. A Google ci\u0105gle wrzuca tam swoje metadane, swoje klucze. I Terraform zawsze informuje, \u017ce ma zmiany. Po ka\u017cdym uruchomieniu, nawet je\u015bli nic si\u0119 nie zmienia, zawsze m\u00f3wi, \u017ce zaktualizuje to pole.<\/em><\/p>\n<p><\/p>\n<p>Z kluczami, ale \u2013 tak, cz\u0119\u015b\u0107 infrastruktury jest dotkni\u0119ta tym problemem, to znaczy, \u017ce Terraform nic nie mo\u017ce zmieni\u0107. My sami te\u017c nic nie mo\u017cemy zmieni\u0107. Na razie \u017cyjemy z tym.<\/p>\n<p><\/p>\n<p><em>To znaczy, \u017ce mieli\u015bcie z tym do czynienia, ale nic nie wymy\u015blili\u015bcie, on po prostu robi to sam?<\/em><\/p>\n<p><\/p>\n<p>Niestety, tak. <\/p>\n<p><\/p>\n<p><em>Cze\u015b\u0107! Nazywam si\u0119 Stanis\u0142aw Starkow. Mail. ru Group. Jak rozwi\u0105zujecie problem z generowaniem tagu na \u2026, jak go przesy\u0142acie? Rozumiem, \u017ce przez User\u2014data, aby wskaza\u0107 nazw\u0119 hosta, wskaza\u0107 Puppet? A druga cz\u0119\u015b\u0107 pytania. Jak rozwi\u0105zujecie ten problem w SG, tzn. kiedy generujecie SG, setki jednorodnych instancji, jak je w\u0142a\u015bciwie nazwa\u0107?<\/em><\/p>\n<p><\/p>\n<p>Te instancje, kt\u00f3re s\u0105 dla nas bardzo wa\u017cne, nazywamy \u0142adnie. Te, kt\u00f3re nie s\u0105 potrzebne, maj\u0105 dopisek, \u017ce to grupa autoskalowania. I teoretycznie mo\u017cna je usun\u0105\u0107, aby uzyska\u0107 now\u0105. <\/p>\n<p><\/p>\n<p>Je\u015bli chodzi o problem z tagiem, to nie chodzi o problem, a o zadanie. Tagi s\u0105 u nas bardzo, bardzo intensywnie u\u017cywane, poniewa\u017c infrastruktura jest du\u017ca i kosztowna. Musimy monitorowa\u0107, na co wydawane s\u0105 pieni\u0105dze, dlatego tagi umo\u017cliwiaj\u0105 rozdzielenie, co i gdzie posz\u0142o. I w konsekwencji wyszukiwanie, gdzie wydawane s\u0105 du\u017ce kwoty. <\/p>\n<p><\/p>\n<p>O co jeszcze by\u0142 pytanie?<\/p>\n<p><\/p>\n<p><em>Kiedy SG tworzy setki instancji, trzeba je jako\u015b odr\u00f3\u017cnia\u0107?<\/em><\/p>\n<p><\/p>\n<p>Nie, nie trzeba. Na ka\u017cdej instancji jest agent, kt\u00f3ry informuje, \u017ce mam problem. Je\u015bli agent zg\u0142asza, to on o nim wie i, przynajmniej, jego adres IP istnieje. Ju\u017c mo\u017cna dzia\u0142a\u0107. Po drugie, u\u017cywamy Consul do odkrywania, tam, gdzie nie ma Kubernetes. I Consul tak\u017ce pokazuje adres IP instancji.<\/p>\n<p><\/p>\n<p><em>To znaczy, \u017ce opieracie si\u0119 na IP, a nie na nazwie hosta?<\/em><\/p>\n<p><\/p>\n<p>Nie mo\u017cna opiera\u0107 si\u0119 na nazwie hosta, to znaczy, \u017ce jest ich bardzo wiele. S\u0105 identyfikatory instancji \u2013 AE itd. Mo\u017cna je gdzie\u015b znale\u017a\u0107, mo\u017cna je wrzuci\u0107 do wyszukiwarki. <\/p>\n<p><\/p>\n<p><em>Cze\u015b\u0107! Zrozumia\u0142em, \u017ce Terraform to \u015bwietna rzecz, dostosowana do chmur.<\/em> <\/p>\n<p><\/p>\n<p>Nie tylko. <\/p>\n<p><\/p>\n<p><em>To mnie w\u0142a\u015bnie interesuje. Co je\u015bli zdecydujecie si\u0119 na masowe przej\u015bcie na Bare Metal ze wszystkimi swoimi instancjami? Czy nie b\u0119dzie \u017cadnych problem\u00f3w? A mo\u017ce jednak b\u0119dziecie musieli u\u017cy\u0107 innych produkt\u00f3w, jak wspomniany tu Ansible?<\/em><\/p>\n<p><\/p>\n<p>Ansible dotycz\u0105ce czego\u015b innego. To znaczy, Ansible dzia\u0142a, gdy instancja jest uruchomiona. Terraform dzia\u0142a przed uruchomieniem instancji. Przej\u015bcie na Bare Metal - nie. <\/p>\n<p><\/p>\n<p><em>Teraz nie, ale przyjdzie biznes i powie: \u201eDajmy spok\u00f3j\u201d.<\/em><\/p>\n<p><\/p>\n<p>Przej\u015bcie do innej chmury - tak, ale tu trzeba to zrealizowa\u0107 w inny spos\u00f3b. Trzeba napisa\u0107 kod Terraform tak, aby z mniejszym trudem mo\u017cna by\u0142o przej\u015b\u0107 do innej chmury. <\/p>\n<p><\/p>\n<p>Pocz\u0105tkowo postawiono sobie cel, aby nasza ca\u0142a infrastruktura by\u0142a agnostyczna, czyli ka\u017cda chmura powinna pasowa\u0107, ale pewnego dnia biznes si\u0119 podda\u0142 i powiedzia\u0142: \u201eOk, przez najbli\u017csze N lat nigdzie nie odejdziemy, mo\u017cna korzysta\u0107 z us\u0142ug Amazonu\u201d.<\/p>\n<p><\/p>\n<p>Terraform pozwala tworzy\u0107 w Front-End zadania, konfigurowa\u0107 PagerDuty, dokumenty danych itd. Ma naprawd\u0119 wiele mo\u017cliwo\u015bci. Mo\u017ce praktycznie kontrolowa\u0107 ca\u0142y \u015bwiat.<\/p>\n<p><\/p>\n<p><em>Dzi\u0119kuj\u0119 za prezentacj\u0119! Ja r\u00f3wnie\u017c od 4 lat pracuj\u0119 z Terraform. Na etapie p\u0142ynnego przej\u015bcia do Terraform, do infrastruktury, do deklaratywnego opisu, napotykali\u015bmy sytuacje, gdy kto\u015b co\u015b robi\u0142 r\u0119cznie, a Ty pr\u00f3bowa\u0142e\u015b zrobi\u0107 plan. I otrzymywa\u0142e\u015b tam jaki\u015b b\u0142\u0105d. Jak rozwi\u0105zujecie takie problemy? Jak znajdziecie zagubione zasoby, kt\u00f3re by\u0142y wskazane?<\/em><\/p>\n<p><\/p>\n<p>G\u0142\u00f3wnie r\u0119cznie i wzrokowo, je\u015bli widzimy w raporcie co\u015b dziwnego, analizujemy, co tam si\u0119 dzieje, albo po prostu usuwamy. A tak w og\u00f3le, pull requesty to standard. <\/p>\n<p><\/p>\n<p><em>Je\u015bli wyst\u0105pi b\u0142\u0105d, czy robicie rollback? Pr\u00f3bowali\u015bcie co\u015b takiego robi\u0107?<\/em><\/p>\n<p><\/p>\n<p>Nie, to decyzja cz\u0142owieka w danej chwili, gdy widzi problem.<\/p>\n<p>\u0179r\u00f3d\u0142o: <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.1.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\/pl\/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.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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\udd47Wzorce w Terraform do walki z chaosem i manualn\u0105 rutyn\u0105. Maksym Kostrykin (Ixtens) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/pl\/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":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/98123","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=98123"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/98123\/revisions"}],"predecessor-version":[{"id":164071,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/98123\/revisions\/164071"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/98124"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=98123"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=98123"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=98123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}