{"id":38747,"date":"2019-10-31T22:25:42","date_gmt":"2019-10-31T19:25:42","guid":{"rendered":"https:\/\/prohoster.info\/blog\/infrastructure-as-code-kak-poborot-problemy-s-pomoshhyu-xp\/"},"modified":"2019-10-31T22:25:42","modified_gmt":"2019-10-31T19:25:42","slug":"infrastructure-as-code-kak-poborot-problemy-s-pomoshhyu-xp","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/infrastructure-as-code-kak-poborot-problemy-s-pomoshhyu-xp","title":{"rendered":"Infrastructure as Code: jak rozwi\u0105za\u0107 problemy za pomoc\u0105 XP","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Cze\u015b\u0107, Habr! Kiedy\u015b narzeka\u0142em na \u017cycie w paradygmacie infrastruktury jako kodu i nic nie proponowa\u0142em, aby rozwi\u0105za\u0107 t\u0119 sytuacj\u0119. Dzi\u015b wr\u00f3ci\u0142em, aby opowiedzie\u0107, jakie podej\u015bcia i praktyki mog\u0105 pom\u00f3c wydosta\u0107 si\u0119 z otch\u0142ani rozpaczy i skierowa\u0107 sytuacj\u0119 we w\u0142a\u015bciwym kierunku. <\/p>\n<p><img decoding=\"async\" alt=\"Infrastructure as Code: jak rozwi\u0105za\u0107 problemy za pomoc\u0105 XP\" src=\"\/wp-content\/uploads\/2019\/10\/e23fbf20980e731ae1cdb4719c97eb00.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nW poprzednim artykule <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzaio\/blog\/465137\/\">Infrastruktura jako kod: pierwsze spotkanie<\/a><\/noindex> Dzieli\u0142em si\u0119 moimi wra\u017ceniami z tej dziedziny, pr\u00f3bowa\u0142em zastanowi\u0107 si\u0119 nad obecn\u0105 sytuacj\u0105 w tej bran\u017cy i nawet zasugerowa\u0142em, \u017ce standardowe, znane wszystkim programistom praktyki mog\u0105 pom\u00f3c. Mog\u0142o si\u0119 wydawa\u0107, \u017ce by\u0142o tam du\u017co narzeka\u0144 na \u017cycie, ale brakowa\u0142o propozycji wyj\u015bcia z trudnej sytuacji. <\/p>\n<h2>Kim jeste\u015bmy, gdzie jeste\u015bmy i jakie mamy problemy<\/h2>\n<p>\nObecnie jeste\u015bmy w zespole SRE Onboarding Team, kt\u00f3ry sk\u0142ada si\u0119 z sze\u015bciu programist\u00f3w i trzech in\u017cynier\u00f3w infrastruktury. Wszyscy staramy si\u0119 pisa\u0107 infrastruktur\u0119 jako kod (IaC). Robimy to, poniewa\u017c w zasadzie potrafimy pisa\u0107 kod i tak naprawd\u0119 jeste\u015bmy programistami na poziomie \u201epowy\u017cej \u015bredniej\u201d. <\/p>\n<ul>\n<li>Mamy zestaw zalet: pewne t\u0142o, znajomo\u015b\u0107 praktyk, umiej\u0119tno\u015b\u0107 pisania kodu oraz ch\u0119\u0107 uczenia si\u0119 nowych rzeczy. <\/li>\n<li>A jest te\u017c s\u0142aba strona, czyli minus: brak wiedzy na temat infrastruktury. <\/li>\n<\/ul>\n<p>\n<b class=\"spoiler_title\">Stos technologii, kt\u00f3re u\u017cywamy w naszym IaC.<\/b><\/p>\n<ul>\n<li>Terraform do tworzenia zasob\u00f3w.<\/li>\n<li>Packer do budowania obraz\u00f3w. S\u0105 to obrazy Windows i CentOS 7.<\/li>\n<li>Jsonnet, aby tworzy\u0107 pot\u0119\u017cne budowy w drone.io, a tak\u017ce do generacji packer json i naszych modu\u0142\u00f3w Terraform.<\/li>\n<li>Azure.<\/li>\n<li>Ansible podczas przygotowywania obraz\u00f3w.<\/li>\n<li>Python do us\u0142ug pomocniczych, jak r\u00f3wnie\u017c skrypt\u00f3w provisioningowych.<\/li>\n<li>A wszystko to w VSCode z wtyczkami, udost\u0119pnionymi mi\u0119dzy cz\u0142onkami zespo\u0142u.<\/li>\n<\/ul>\n<p>Wniosek z mojej <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzaio\/blog\/465137\/\">poprzedniego artyku\u0142u<\/a><\/noindex> by\u0142 taki: pr\u00f3bowa\u0142em wpoi\u0107 (przede wszystkim w siebie) optymizm, chcia\u0142em powiedzie\u0107, \u017ce b\u0119dziemy pr\u00f3bowa\u0107 znanych nam podej\u015b\u0107 i praktyk, aby walczy\u0107 z trudno\u015bciami i skomplikowaniem, kt\u00f3re s\u0105 w tej dziedzinie. <\/p>\n<p>W tej chwili zmierzamy si\u0119 z nast\u0119puj\u0105cymi problemami IaC:<\/p>\n<ul>\n<li>Niedoskona\u0142o\u015b\u0107 narz\u0119dzi, \u015brodk\u00f3w do tworzenia kodu.<\/li>\n<li>Wolne wdra\u017canie. Infrastruktura to cz\u0119\u015b\u0107 rzeczywistego \u015bwiata, a ten mo\u017ce by\u0107 niepr\u0119dki.<\/li>\n<li>Brak podej\u015b\u0107 i praktyk.<\/li>\n<li>Jeste\u015bmy nowicjuszami i niewiele wiemy.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Ekstremalne programowanie (XP) spieszy z pomoc\u0105<\/h2>\n<p>\nWszystkim programistom dobrze znane jest ekstremalne programowanie (XP) oraz praktyki, kt\u00f3re za nim stoj\u0105. Wielu z nas pracowa\u0142o wed\u0142ug tego podej\u015bcia, i okaza\u0142o si\u0119 ono skuteczne. Wi\u0119c dlaczego nie skorzysta\u0107 z zasad i praktyk w nim zawartych, aby poradzi\u0107 sobie z trudno\u015bciami infrastruktury? Postanowili\u015bmy zastosowa\u0107 to podej\u015bcie i zobaczy\u0107, co z tego wyniknie.<\/p>\n<p><b class=\"spoiler_title\">Ocena zastosowania podej\u015bcia XP w Twojej dziedzinie<\/b>Podaj\u0119 opis \u015brodowiska, dla kt\u00f3rego XP nadaje si\u0119 najlepiej, oraz jak to si\u0119 odnosi do nas: <\/p>\n<p>1. Dynamicznie zmieniaj\u0105ce si\u0119 wymagania oprogramowania. Wiedzieli\u015bmy, jaki jest ostateczny cel. Jednak szczeg\u00f3\u0142y mog\u0105 si\u0119 r\u00f3\u017cni\u0107. Sami decydujemy, w kt\u00f3r\u0105 stron\u0119 powinni\u015bmy si\u0119 skierowa\u0107, dlatego wymagania okresowo si\u0119 zmieniaj\u0105 (g\u0142\u00f3wnie przez nas samych). W przypadku zespo\u0142u SRE, kt\u00f3ry sam zajmuje si\u0119 automatyzacj\u0105 i ogranicza wymagania oraz zakres prac, ten punkt dobrze sprawdza si\u0119. <\/p>\n<p>2. Ryzyko wynikaj\u0105ce z projekt\u00f3w o sta\u0142ym czasie przy u\u017cyciu nowych technologii. Mog\u0105 pojawi\u0107 si\u0119 ryzyka zwi\u0105zane z u\u017cyciem rzeczy, kt\u00f3re s\u0105 nam nieznane. I to jest w 100% nasz przypadek. Ca\u0142y nasz projekt opiera si\u0119 na technologiach, z kt\u00f3rymi nie byli\u015bmy do ko\u0144ca zaznajomieni. To wci\u0105\u017c jest problem, poniewa\u017c w dziedzinie infrastruktury nieustannie pojawia si\u0119 wiele nowych technologii. <\/p>\n<p>3,4. Ma\u0142y, wsp\u00f3\u0142lokalizowany rozwini\u0119ty zesp\u00f3\u0142. Technologia, kt\u00f3r\u0105 u\u017cywasz, umo\u017cliwia automatyczne testy jednostkowe i funkcjonalne. Te dwa punkty nie do ko\u0144ca do nas pasuj\u0105. Po pierwsze, nie jeste\u015bmy wsp\u00f3\u0142lokalizowanym zespo\u0142em, po drugie, jest nas dziewi\u0119\u0107 os\u00f3b, co mo\u017cna uzna\u0107 za du\u017cy zesp\u00f3\u0142. Cho\u0107 wed\u0142ug niekt\u00f3rych definicji \u201edu\u017cego\u201d zespo\u0142u, wiele to 14+ os\u00f3b. <\/p>\n<p>Przyjrzyjmy si\u0119 niekt\u00f3rym praktykom z XP i temu, jak wp\u0142ywaj\u0105 one na szybko\u015b\u0107 i jako\u015b\u0107 informacji zwrotnej.<\/p>\n<h4>Zasada cyklu informacji zwrotnej w XP<\/h4>\n<p>\nMoim zdaniem informacja zwrotna to odpowied\u017a na pytanie, czy dobrze to robi\u0119, czy idziemy w dobrym kierunku? W XP istnieje na ten temat cudowny schemat: cykl informacji zwrotnej w czasie. Interesuj\u0105ce jest to, \u017ce im ni\u017cej jeste\u015bmy, tym szybciej mo\u017cemy uzyska\u0107 OS, aby odpowiedzie\u0107 na swoje pytania. <\/p>\n<p><img decoding=\"async\" alt=\"Infrastructure as Code: jak rozwi\u0105za\u0107 problemy za pomoc\u0105 XP\" src=\"\/wp-content\/uploads\/2019\/10\/e381fb2d7937cbd1978fd6740e63e790.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTo do\u015b\u0107 ciekawy temat do dyskusji, \u017ce w naszej bran\u017cy IT mo\u017cna szybko uzyska\u0107 OS. Wyobra\u017a sobie, jak trudne jest zrealizowanie jakiego\u015b projektu przez sze\u015b\u0107 miesi\u0119cy i dopiero wtedy dowiedzie\u0107 si\u0119, \u017ce na samym pocz\u0105tku pope\u0142niono b\u0142\u0105d. Takie sytuacje zdarzaj\u0105 si\u0119 zar\u00f3wno w projektowaniu, jak i w ka\u017cdym budowaniu skomplikowanych system\u00f3w. <\/p>\n<p>W naszym przypadku IaC pomaga nam w uzyskaniu informacji zwrotnej. Od razu wprowadzam niewielk\u0105 korekt\u0119 do powy\u017cszego schematu: plan wydania realizowany jest nie w miesi\u0119cznym cyklu, lecz odbywa si\u0119 kilka razy dziennie. Do tego cyklu OS s\u0105 przypisane pewne praktyki, kt\u00f3re om\u00f3wimy bardziej szczeg\u00f3\u0142owo.<\/p>\n<blockquote><p>Wa\u017cne: informacja zwrotna mo\u017ce sta\u0107 si\u0119 rozwi\u0105zaniem dla wszystkich wymienionych powy\u017cej problem\u00f3w. W po\u0142\u0105czeniu z praktykami XP mo\u017ce wyci\u0105gn\u0105\u0107 z otch\u0142ani rozpaczy.<\/p><\/blockquote>\n<p><\/p>\n<h2>Jak wyci\u0105gn\u0105\u0107 siebie z otch\u0142ani rozpaczy: trzy praktyki<\/h2>\n<p><\/p>\n<h4>Testy <\/h4>\n<p>\nTesty s\u0105 wspomniane dwukrotnie w cyklu informacji zwrotnej XP. Nie jest to przypadkowe. S\u0105 niezwykle wa\u017cne dla ca\u0142ej techniki programowania ekstremalnego. <\/p>\n<p>Zak\u0142ada si\u0119, \u017ce masz testy jednostkowe i akceptacyjne. Jedne daj\u0105 Ci informacj\u0119 zwrotn\u0105 w ci\u0105gu kilku minut, inne w ci\u0105gu kilku dni, dlatego pisze si\u0119 je d\u0142u\u017cej, a uruchamia rzadziej. <\/p>\n<p>Istnieje klasyczna piramida testowania, kt\u00f3ra pokazuje, \u017ce pewnych test\u00f3w powinno by\u0107 wi\u0119cej. <\/p>\n<p><img decoding=\"async\" alt=\"Infrastructure as Code: jak rozwi\u0105za\u0107 problemy za pomoc\u0105 XP\" src=\"\/wp-content\/uploads\/2019\/10\/29f3217f11b67378c9c0c3f14fab9d61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJak ten schemat jest zastosowany w naszym projekcie IaC? W rzeczywisto\u015bci\u2026 wcale. <\/p>\n<ul>\n<li>Test\u00f3w jednostkowych, mimo \u017ce powinno ich by\u0107 bardzo wiele, nie mo\u017ce by\u0107 za du\u017co. Albo testuj\u0105 co\u015b bardzo po\u015brednio. Mo\u017cna praktycznie powiedzie\u0107, \u017ce w og\u00f3le ich nie piszemy. Ale oto kilka zastosowa\u0144 dla takich test\u00f3w, kt\u00f3re uda\u0142o nam si\u0119 jednak wykona\u0107:\n<ol>\n<li>Testowanie kodu w jsonnet. To na przyk\u0142ad nasz pipeline budowania w drone, kt\u00f3ry jest do\u015b\u0107 skomplikowany. Kod w jsonnet jest dobrze pokrywany testami. <br \/>\n U\u017cywamy tego <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/yugui\/jsonnetunit\">Unit testing framework for Jsonnet<\/a><\/noindex>. <\/li>\n<li> Testy skrypt\u00f3w, kt\u00f3re s\u0105 wykonywane przy uruchamianiu zasobu. Skrypty w Pythonie, wi\u0119c r\u00f3wnie\u017c testy na nie mo\u017cna pisa\u0107.<\/li>\n<\/ol>\n<\/li>\n<li>Potencjalnie mo\u017cliwa jest weryfikacja konfiguracji w testach, ale tak nie robimy. Jest r\u00f3wnie\u017c mo\u017cliwo\u015b\u0107 skonfigurowania weryfikacji zasad konfigurowania zasob\u00f3w za pomoc\u0105 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wata727\/tflint\">tflint<\/a><\/noindex>. Jednak dla terraforma s\u0105 tam zbyt podstawowe kontrole, ale wiele scenariuszy testowych napisano dla AWS. A my jeste\u015bmy na Azure, wi\u0119c to znowu nie pasuje.<\/li>\n<li>Testy integracyjne komponent\u00f3w: to zale\u017cy od tego, jak je klasyfikujesz i gdzie je rozk\u0142adasz. Ale zasadniczo dzia\u0142aj\u0105.\n<p>Tak wygl\u0105daj\u0105 testy integracyjne. <\/p>\n<p><img decoding=\"async\" alt=\"Infrastructure as Code: jak rozwi\u0105za\u0107 problemy za pomoc\u0105 XP\" src=\"\/wp-content\/uploads\/2019\/10\/b4771e9e5d329ffb2ba565ead7fdddfd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTo przyk\u0142ad podczas budowania obraz\u00f3w w Drone CI. Aby do nich dotrze\u0107, trzeba czeka\u0107 30 minut na zbudowanie obrazu Packer, a nast\u0119pnie jeszcze 15 minut, a\u017c zostan\u0105 zako\u0144czone. Ale s\u0105! <\/p>\n<p><b class=\"spoiler_title\">Algorytm weryfikacji obraz\u00f3w<\/b> <\/p>\n<ol>\n<li>Najpierw Packer musi ca\u0142kowicie przygotowa\u0107 obraz.<\/li>\n<li>Obok testu znajduje si\u0119 terraform z lokalnym stanem, kt\u00f3ry wykorzystujemy do uruchamiania tego obrazu. <\/li>\n<li>Podczas uruchamiania wykorzystywany jest ma\u0142y modu\u0142 le\u017c\u0105cy obok, co u\u0142atwia prac\u0119 z obrazem. <\/li>\n<li>Gdy VM jest uruchomiona z obrazu, mo\u017cna rozpocz\u0105\u0107 testy. W zasadzie testy prowadzone s\u0105 na maszynie. Sprawdzane jest, jak dzia\u0142aj\u0105 skrypty przy starcie i jak funkcjonuj\u0105 demony. W tym celu przez ssh lub winrm wchodzimy na w\u0142a\u015bnie uruchomion\u0105 maszyn\u0119 i sprawdzamy stan konfiguracji lub, czy uruchomi\u0142y si\u0119 us\u0142ugi.<\/li>\n<\/ol>\n<p>\n <\/li>\n<li>Podobna sytuacja dotyczy test\u00f3w integracyjnych i modu\u0142\u00f3w dla terrraform. Oto kr\u00f3tka tabela wyja\u015bniaj\u0105ca szczeg\u00f3\u0142y takich test\u00f3w.\n<p><img decoding=\"async\" alt=\"Infrastructure as Code: jak rozwi\u0105za\u0107 problemy za pomoc\u0105 XP\" src=\"\/wp-content\/uploads\/2019\/10\/e2624fb97831701e374a7e8e7fe39a16.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCzas odpowiedzi na pipeline wynosi oko\u0142o 40 minut. Wszystko przebiega bardzo powoli. Mo\u017cna to wykorzysta\u0107 do regresji, ale w przypadku nowego rozwoju jest to ca\u0142kowicie niemo\u017cliwe. Je\u015bli naprawd\u0119 si\u0119 do tego przygotujesz, przygotujesz running i skrypty, mo\u017cna skr\u00f3ci\u0107 to do 10 minut. Ale to i tak nie s\u0105 testy jednostkowe, kt\u00f3re wykonuj\u0105 100 test\u00f3w w 5 sekund. <\/li>\n<\/ul>\n<p>\nBrak test\u00f3w jednostkowych przy tworzeniu obraz\u00f3w lub modu\u0142\u00f3w terrraform zmusza do przerzucania pracy na osobne us\u0142ugi, kt\u00f3re mo\u017cna \u0142atwo wywo\u0142a\u0107 przez REST, lub na skrypty Python.<\/p>\n<p>Na przyk\u0142ad, musieli\u015bmy zrobi\u0107 tak, aby przy uruchomieniu maszyny wirtualnej rejestrowa\u0142a si\u0119 ona w us\u0142udze <noindex><a rel=\"nofollow\" href=\"https:\/\/www.scaleft.com\/\">ScaleFT<\/a><\/noindex>, a przy usuni\u0119ciu wirtualki usuwa\u0142a siebie.<\/p>\n<p>Poniewa\u017c ScaleFT jest dla nas us\u0142ug\u0105, jeste\u015bmy zmuszeni pracowa\u0107 z ni\u0105 przez API. Zosta\u0142a napisana nak\u0142adka, kt\u00f3r\u0105 mo\u017cna wywo\u0142a\u0107 i powiedzie\u0107: \u201eZdejmij to i tamto\u201d. Przechowuje ona wszystkie niezb\u0119dne ustawienia i dost\u0119p. <\/p>\n<p>Na to mo\u017cemy ju\u017c pisa\u0107 normalne testy, poniewa\u017c nie r\u00f3\u017cni si\u0119 to od zwyk\u0142ego oprogramowania: mockujesz jakie\u015b API, wywo\u0142ujesz je i obserwujesz, co si\u0119 dzieje. <\/p>\n<p><img decoding=\"async\" alt=\"Infrastructure as Code: jak rozwi\u0105za\u0107 problemy za pomoc\u0105 XP\" src=\"\/wp-content\/uploads\/2019\/10\/dc17aaa64038acb080669d31fe8ecfe0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote><p>Podsumowanie test\u00f3w: Testowanie jednostkowe, kt\u00f3re powinno dawa\u0107 OS w minut\u0119, tego nie robi. A wy\u017csze rodzaje test\u00f3w w piramidzie daj\u0105 efekt, ale obejmuj\u0105 tylko cz\u0119\u015b\u0107 problem\u00f3w. <\/p><\/blockquote>\n<h4>Programowanie w parach<\/h4>\n<p>\nTesty to oczywi\u015bcie co\u015b dobrego. Mo\u017cna ich pisa\u0107 du\u017co, mog\u0105 by\u0107 r\u00f3\u017cnych rodzaj\u00f3w. B\u0119d\u0105 dzia\u0142a\u0107 na swoich poziomach i dawa\u0107 nam zwrotn\u0105 informacj\u0119. Jednak problem z kiepskimi testami jednostkowymi, kt\u00f3re daj\u0105 najszybszy system operacyjny, nadal pozostaje. A jednak wci\u0105\u017c pragnie si\u0119 szybkiego systemu operacyjnego, z kt\u00f3rym \u0142atwo i przyjemnie si\u0119 pracuje. Nie wspominaj\u0105c ju\u017c o jako\u015bci uzyskanego rozwi\u0105zania. Na szcz\u0119\u015bcie istniej\u0105 techniki, kt\u00f3re pozwalaj\u0105 na szybsze uzyskanie informacji zwrotnej ni\u017c testy modu\u0142owe. To programowanie w parach.<\/p>\n<p>Pisz\u0105c kod, chcemy jak najszybciej uzyska\u0107 informacj\u0119 zwrotn\u0105 na jego temat. Tak, mo\u017cna napisa\u0107 wszystko w ga\u0142\u0119zi funkcji (aby nikomu nic nie popsuli), zrobi\u0107 pull request na GitHubie, przypisa\u0107 go do kogo\u015b, kogo zdanie ma znaczenie, i czeka\u0107 na odpowied\u017a. <\/p>\n<p>Ale czekanie mo\u017ce trwa\u0107 d\u0142ugo. Ludzie s\u0105 zaj\u0119ci, a odpowied\u017a, nawet je\u015bli przyjdzie, mo\u017ce nie by\u0107 najwy\u017cszej jako\u015bci. Za\u0142\u00f3\u017cmy, \u017ce odpowied\u017a przysz\u0142a od razu, recenzent momentalnie zrozumia\u0142 ca\u0142y zamys\u0142, ale odpowied\u017a i tak przychodzi z op\u00f3\u017anieniem, post factum. A chcieliby\u015bmy wcze\u015bniej. W\u0142a\u015bnie to programowanie w parach ma na celu \u2013 by natychmiast, w momencie pisania.<\/p>\n<p>Nast\u0119pnie przedstawiam style programowania w parach oraz ich zastosowanie w pracy nad IaC: <\/p>\n<p><b>1. Klasyczny, Do\u015bwiadczony+do\u015bwiadczony, zmiana co okre\u015blony czas.<\/b> Dwie role \u2013 kierowca i nawigator. Dwie osoby. Pracuj\u0105 nad jednym kodem i zmieniaj\u0105 si\u0119 rolami co okre\u015blony z g\u00f3ry czas. <\/p>\n<p>Zobaczmy, jak nasze problemy \u0142\u0105cz\u0105 si\u0119 ze stylem: <\/p>\n<ul>\n<li>Problem: niedoskona\u0142o\u015b\u0107 narz\u0119dzi i \u015brodk\u00f3w do tworzenia kodu. <br \/>\nNegatywny wp\u0142yw: d\u0142u\u017cej si\u0119 rozwija, spowalniamy si\u0119, rytm pracy si\u0119 zaburza.<br \/>\n Jak z tym walczymy: stosujemy inne narz\u0119dzia, wsp\u00f3lne IDE i dodatkowo uczymy si\u0119 skr\u00f3t\u00f3w.<\/li>\n<li> Problem: wolne wdra\u017canie. <br \/>\nNegatywny wp\u0142yw: wyd\u0142u\u017ca czas tworzenia dzia\u0142aj\u0105cego kawa\u0142ka kodu. Nudzimy si\u0119 podczas czekania, r\u0119ce ci\u0105gn\u0105, by zaj\u0105\u0107 si\u0119 czym\u015b innym, podczas oczekiwania. <br \/>\nJak z tym walczymy: nie pokonali\u015bmy tego.<\/li>\n<li> Problem: brak podej\u015b\u0107 i praktyk. <br \/>\nNegatywny wp\u0142yw: brak wiedzy, jak robi\u0107 dobrze, a jak \u017ale. Wyd\u0142u\u017ca uzyskiwanie informacji zwrotnej. <br \/>\nJak z tym walczymy: wzajemna wymiana opinii i praktyk w pracy w parach prawie rozwi\u0105zuje problem.<\/li>\n<\/ul>\n<p>\nG\u0142\u00f3wnym problemem zwi\u0105zanym z zastosowaniem tego stylu w IaC jest nier\u00f3wnomierne tempo pracy. W tradycyjnym programowaniu masz bardzo r\u00f3wnomierny post\u0119p. Mo\u017cesz sp\u0119dzi\u0107 pi\u0119\u0107 minut i napisa\u0107 N. Sp\u0119dzi\u0107 10 minut i napisa\u0107 2N, 15 minut \u2013 3N. Tutaj mo\u017cna sp\u0119dzi\u0107 pi\u0119\u0107 minut i napisa\u0107 N, a potem sp\u0119dzi\u0107 kolejne 30 minut i napisa\u0107 jedn\u0105 dziesi\u0105t\u0105 N. Tutaj nic nie wiesz, masz zator. Rozwi\u0105zywanie problemu zajmuje czas i odci\u0105ga od samego programowania. <\/p>\n<blockquote><p>Wniosek: w czystej postaci nam to nie odpowiada.<\/p><\/blockquote>\n<p><b>2. Ping-pong. To podej\u015bcie zak\u0142ada, \u017ce jeden uczestnik pisze test, a drugi tworzy jego implementacj\u0119.<\/b> Bior\u0105c pod uwag\u0119, \u017ce z testami jednostkowymi wszystko jest skomplikowane i trzeba pisa\u0107 d\u0142ugie testy integracyjne, wszelka lekko\u015b\u0107 ping-ponga znika. <\/p>\n<p>Mog\u0119 powiedzie\u0107, \u017ce pr\u00f3bowali\u015bmy podzia\u0142u obowi\u0105zk\u00f3w w projektowaniu scenariusza testu i implementacji kodu do niego. Jeden uczestnik wymy\u015bla\u0142 scenariusz, w tej cz\u0119\u015bci pracy by\u0142 odpowiedzialny, mia\u0142 ostatnie s\u0142owo. A drugi by\u0142 odpowiedzialny za implementacj\u0119. To wychodzi\u0142o dobrze. Jako\u015b\u0107 scenariusza wzrasta\u0142a przy takim podej\u015bciu. <\/p>\n<blockquote><p>Wniosek: niestety, tempo pracy nie pozwala na u\u017cycie ping-ponga jako praktyki programowania w parach w IaC.<\/p><\/blockquote>\n<p>\n <b>3. Strong Style.<\/b> <noindex><a rel=\"nofollow\" href=\"http:\/\/llewellynfalco.blogspot.com\/2014\/06\/llewellyns-strong-style-pairing.html\">Skomplikowana praktyka<\/a><\/noindex>. Idea polega na tym, \u017ce jeden uczestnik staje si\u0119 dyrektywnym nawigatorem, a drugi przyjmuje rol\u0119 wykonawczego kierowcy. Przy tym prawo decyzji nale\u017cy wy\u0142\u0105cznie do nawigatora. Kierowca jedynie pisze i s\u0142owem mo\u017ce wp\u0142yn\u0105\u0107 na to, co si\u0119 dzieje. Role nie zmieniaj\u0105 si\u0119 przez d\u0142ugi czas. <\/p>\n<p>Dobrze sprawdza si\u0119 w nauce, ale wymaga silnych umiej\u0119tno\u015bci interpersonalnych. Na tym si\u0119 potkn\u0119li\u015bmy. Technika sz\u0142a trudno. I nie chodzi tutaj nawet o infrastruktur\u0119. <\/p>\n<blockquote><p>Wniosek: potencjalnie mo\u017ce by\u0107 stosowane, nie rezygnujemy z pr\u00f3b.<\/p><\/blockquote>\n<p>\n<b>4. Mobbing, swarming i wszystkie znane, ale tu nie wymienione style<\/b> nie rozwa\u017camy, poniewa\u017c nie pr\u00f3bowali\u015bmy i nie mo\u017cemy o tym m\u00f3wi\u0107 w kontek\u015bcie naszej pracy.<\/p>\n<blockquote><p>Og\u00f3lne wnioski dotycz\u0105ce stosowania programowania w parach:<\/p>\n<ul>\n<li>Mamy nier\u00f3wnomierne tempo pracy, kt\u00f3re dezorientuje.<\/li>\n<li>Zderzyli\u015bmy si\u0119 z niewystarczaj\u0105co dobrymi umiej\u0119tno\u015bciami interpersonalnymi. A przedmiot pracy nie sprzyja pokonywaniu tych naszych brak\u00f3w.<\/li>\n<li>D\u0142ugie testy, problemy z narz\u0119dziami sprawiaj\u0105, \u017ce wsp\u00f3lne programowanie staje si\u0119 mozo\u0142em.<\/li>\n<\/ul>\n<\/blockquote>\n<p><b>5. Mimo to, odnotowali\u015bmy r\u00f3wnie\u017c sukcesy. Opracowali\u015bmy nasz\u0105 w\u0142asn\u0105 metod\u0119 \u201eZbie\u017cno\u015b\u0107 - rozbie\u017cno\u015b\u0107\u201d.<\/b> Kr\u00f3tko opisz\u0119, jak to dzia\u0142a. <\/p>\n<p>Mamy sta\u0142ych partner\u00f3w na kilka dni (mniej ni\u017c tydzie\u0144). Wsp\u00f3lnie realizujemy jedno zadanie. Przez jaki\u015b czas pracujemy razem: jedna osoba pisze, druga obserwuje, jak zesp\u00f3\u0142 wsparcia. Potem rozdzielamy si\u0119 na jaki\u015b czas, ka\u017cda osoba wykonuje niezale\u017cne zadania, po czym znowu si\u0119 spotykamy, szybko synchronizujemy, robi\u0105c co\u015b razem i zn\u00f3w si\u0119 rozdzielamy. <\/p>\n<h4>Planowanie i komunikacja<\/h4>\n<p>\nOstatni blok praktyk, poprzez kt\u00f3re rozwi\u0105zujemy problemy OS, to organizacja prac zwi\u0105zanych z samymi zadaniami. Wchodzi w to r\u00f3wnie\u017c wymiana do\u015bwiadcze\u0144, kt\u00f3re wychodz\u0105 poza prac\u0119 w parze. Rozwa\u017cmy trzy praktyki:<\/p>\n<p><b>1. Zadania przez drzewo cel\u00f3w.<\/b> Og\u00f3lne prowadzenie projektu organizujemy poprzez drzewo, kt\u00f3re nieprzerwanie si\u0119ga w przysz\u0142o\u015b\u0107. Technicznie prowadzenie jest realizowane w Miro. Jest jedno zadanie - to cel po\u015bredni. Z niego wynikaj\u0105 mniejsze cele lub grupy zada\u0144. Z nich powstaj\u0105 same zadania. Wszystkie zadania s\u0105 tworzone i prowadzone na tej tablicy. <\/p>\n<p><img decoding=\"async\" alt=\"Infrastructure as Code: jak rozwi\u0105za\u0107 problemy za pomoc\u0105 XP\" src=\"\/wp-content\/uploads\/2019\/10\/fe601e959f0055de4f7f4c39ae713c31.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTen schemat r\u00f3wnie\u017c daje informacje zwrotne, kt\u00f3re odbywaj\u0105 si\u0119 raz dziennie, gdy synchronizujemy si\u0119 na spotkaniach. Posiadanie wsp\u00f3lnego planu, kt\u00f3ry jest jednocze\u015bnie usystematyzowany i ca\u0142kowicie otwarty, pozwala ka\u017cdemu by\u0107 na bie\u017c\u0105co z post\u0119pami i tym, jak daleko zaszli\u015bmy. <\/p>\n<p>Zalety wizualnego przedstawiania zada\u0144:<\/p>\n<ul>\n<li>Kausalno\u015b\u0107. Ka\u017cde zadanie prowadzi do jakiego\u015b og\u00f3lnego celu. Zadania grupowane s\u0105 wed\u0142ug mniejszych cel\u00f3w. Obszar infrastruktury sam w sobie jest do\u015b\u0107 techniczny. Nie zawsze od razu wiadomo, jakie konkretnie ma wp\u0142yw na biznes, na przyk\u0142ad pisanie podr\u0119cznika migracji na innego nginx. Obecno\u015b\u0107 celu obok karty czynno\u015bci czyni to bardziej zrozumia\u0142ym.<br \/>\n <img decoding=\"async\" alt=\"Infrastructure as Code: jak rozwi\u0105za\u0107 problemy za pomoc\u0105 XP\" src=\"\/wp-content\/uploads\/2019\/10\/fc4da9d277f7dc186a5710cf2be4419c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n Kausalno\u015b\u0107 to wa\u017cna cecha zada\u0144. Bezpo\u015brednio odpowiada na pytanie: \u201eCzy to, co robi\u0119, jest w\u0142a\u015bciwe?\u201d <\/li>\n<li>R\u00f3wnoleg\u0142o\u015b\u0107. Jest nas dziewi\u0119cioro i fizycznie niemo\u017cliwe jest, aby wszyscy skupiali si\u0119 na jednym zadaniu. Zadania z jednej dziedziny nie zawsze wystarcz\u0105. Zmuszeni jeste\u015bmy dzieli\u0107 prac\u0119 mi\u0119dzy ma\u0142e grupy robocze. Grupy pracuj\u0105 przez pewien czas nad swoim zadaniem, mog\u0105 by\u0107 dodatkowo wzmocnione przez kogo\u015b innego. Czasami z tej grupy roboczej odchodz\u0105 ludzie. Kto\u015b idzie na urlop, kto\u015b przygotowuje prezentacj\u0119 na konferencj\u0119 DevOps conf, kto\u015b inny pisze artyku\u0142 na Habr. Wa\u017cne staje si\u0119 zrozumienie, jakie cele i zadania mog\u0105 by\u0107 realizowane r\u00f3wnolegle. <\/li>\n<\/ul>\n<p>\n<b>2. Zmienni prowadz\u0105cy poranne spotkania.<\/b> Na stand-upach pojawi\u0142 si\u0119 problem \u2013 wiele zada\u0144 ludzie wykonuj\u0105 r\u00f3wnolegle. Czasami zadania s\u0105 s\u0142abo powi\u0105zane i nie ma zrozumienia, kto co robi. A zdanie jeszcze jednego cz\u0142onka zespo\u0142u jest bardzo wa\u017cne. To dodatkowa informacja, kt\u00f3ra mo\u017ce zmieni\u0107 przebieg rozwi\u0105zania zadania. Oczywi\u015bcie zazwyczaj jest z tob\u0105 kto\u015b w parze, ale konsultacje i wskaz\u00f3wki zawsze s\u0105 pomocne. <\/p>\n<p>Aby poprawi\u0107 t\u0119 sytuacj\u0119, wprowadzili\u015bmy technik\u0119 \u201eZmiana prowadz\u0105cego stand-up\u201d. Teraz rotujemy wed\u0142ug okre\u015blonej listy i to ma sw\u00f3j efekt. Kiedy nadchodzi twoja kolej, zmuszasz si\u0119 do zanurzenia i zrozumienia, co si\u0119 dzieje, aby dobrze przeprowadzi\u0107 spotkanie scrumowe. <\/p>\n<p><img decoding=\"async\" alt=\"Infrastructure as Code: jak rozwi\u0105za\u0107 problemy za pomoc\u0105 XP\" src=\"\/wp-content\/uploads\/2019\/10\/622973a654ecd3e27a7a366596814ffc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>3. Wewn\u0119trzne demo.<\/b> Pomoc w rozwi\u0105zywaniu zada\u0144 przez programowanie w parach, wizualizacja w drzewie zada\u0144 i wsparcie w porannych scrumach \u2013 to dobre, ale nie idealne. W parze ograniczasz si\u0119 tylko do swojej wiedzy. Drzewo zada\u0144 pomaga globalnie zrozumie\u0107, kto co robi. A prowadz\u0105cy i koledzy na porannym spotkaniu nie zanurz\u0105 si\u0119 g\u0142\u0119boko w twoje problemy. Na pewno mog\u0105 co\u015b przeoczy\u0107. <\/p>\n<p>Rozwi\u0105zaniem okaza\u0142o si\u0119 prezentowanie zrealizowanych prac sobie nawzajem i ich p\u00f3\u017aniejsze omawianie. Spotykamy si\u0119 raz w tygodniu na godzin\u0119 i pokazujemy szczeg\u00f3\u0142y rozwi\u0105za\u0144 zwi\u0105zanych z zadaniami, kt\u00f3re realizowali\u015bmy w ostatnim tygodniu. <\/p>\n<p>W trakcie prezentacji nale\u017cy ujawni\u0107 szczeg\u00f3\u0142y zadania i koniecznie pokaza\u0107 jego dzia\u0142anie. <\/p>\n<p><b class=\"spoiler_title\">Prezentacj\u0119 mo\u017cna prowadzi\u0107 wed\u0142ug listy kontrolnej.<\/b>1. Wprowad\u017a w kontekst. Sk\u0105d wzi\u0105\u0142 si\u0119 problem, po co to w og\u00f3le by\u0142o potrzebne?<\/p>\n<p>2. Jak problem by\u0142 rozwi\u0105zywany do tej pory? Na przyk\u0142ad, potrzebne by\u0142o masowe klikanie myszk\u0105, lub w og\u00f3le nie da\u0142o si\u0119 czego\u015b zrobi\u0107.<\/p>\n<p>3. Jak to poprawiamy. Na przyk\u0142ad: \u201eZobaczcie, teraz mamy skrypt, oto readme.\u201d<\/p>\n<p>4. Poka\u017c, jak to dzia\u0142a. Najlepiej zrealizowa\u0107 jaki\u015b scenariusz u\u017cytkownika. Chc\u0119 X, robi\u0119 Y, widz\u0119 Z. Na przyk\u0142ad, wdra\u017cam NGINX, sprawdzam URL, otrzymuj\u0119 200 OK. Je\u015bli dzia\u0142anie jest d\u0142ugie, przygotuj to wcze\u015bniej, aby p\u00f3\u017aniej pokaza\u0107. Najlepiej, aby godzin\u0119 przed demo nie by\u0142o ju\u017c powa\u017cnych awarii, je\u015bli co\u015b jest delikatne.<\/p>\n<p>5. Wyja\u015bnij, jak skutecznie rozwi\u0105zano problem, jakie trudno\u015bci pozosta\u0142y, co jest do zrobienia, jakie ulepszenia s\u0105 mo\u017cliwe w przysz\u0142o\u015bci. Na przyk\u0142ad, obecnie cli, a p\u00f3\u017aniej b\u0119dzie pe\u0142na automatyzacja w CI.<\/p>\n<p>Ka\u017cdy prelegent powinien zmie\u015bci\u0107 si\u0119 w 5-10 minut. Je\u015bli Twoje wyst\u0105pienie jest z za\u0142o\u017cenia wa\u017cne i zajmie wi\u0119cej czasu, skonsultuj to wcze\u015bniej w kanale sre-takeover.<\/p>\n<p>Po cz\u0119\u015bci na \u017cywo zawsze odbywa si\u0119 dyskusja w w\u0105tku. To tutaj pojawia si\u0119 ta potrzebna nam informacja zwrotna na temat naszych zada\u0144. <\/p>\n<p><img decoding=\"async\" alt=\"Infrastructure as Code: jak rozwi\u0105za\u0107 problemy za pomoc\u0105 XP\" src=\"\/wp-content\/uploads\/2019\/10\/77da888d24b52c7eea7e65d2400e152c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNa koniec przeprowadza si\u0119 ankiet\u0119 w celu ustalenia u\u017cyteczno\u015bci odbywaj\u0105cych si\u0119 prezentacji. To ju\u017c jest informacja zwrotna na temat samego wyst\u0105pienia i znaczenia zadania.<\/p>\n<p><img decoding=\"async\" alt=\"Infrastructure as Code: jak rozwi\u0105za\u0107 problemy za pomoc\u0105 XP\" src=\"\/wp-content\/uploads\/2019\/10\/7642cd87050171cc4a6bf278329dd283.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>D\u0142ugie wnioski i co dalej<\/h2>\n<p>\nMo\u017ce si\u0119 wydawa\u0107, \u017ce ton artyku\u0142u jest nieco pesymistyczny. Nic bardziej mylnego. Dwa podstawowe poziomy uzyskiwania informacji zwrotnej, a mianowicie testy i programowanie w parach, dzia\u0142aj\u0105. Nieco inaczej ni\u017c w tradycyjnym programowaniu, ale pozytywny efekt z tego jest. <\/p>\n<p>Testy, w ich obecnym stanie, zapewniaj\u0105 tylko cz\u0119\u015bciowe pokrycie kodu. Wiele funkcji konfiguracji pozostaje nieprzetestowanych. Ich wp\u0142yw na codzienn\u0105 prac\u0119 przy pisaniu kodu jest niewielki. Jednak efekt test\u00f3w integracyjnych jest odczuwalny, to w\u0142a\u015bnie one pozwalaj\u0105 na bezpieczne przeprowadzanie refaktoryzacji. To du\u017cy sukces. Ponadto z przeniesieniem nacisku na rozw\u00f3j w j\u0119zykach wysokiego poziomu (u nas python, go), problem znika. A do \u00bbklejenia\u00ab potrzebnych jest niewiele sprawdze\u0144, wystarcza og\u00f3lny test integracyjny.<\/p>\n<p>Praca w parze bardziej zale\u017cy od konkretnych ludzi. Istnieje czynnik zadania i nasze umiej\u0119tno\u015bci interpersonalne. Z niekt\u00f3rymi wsp\u00f3\u0142praca uk\u0142ada si\u0119 bardzo dobrze, z innymi gorzej. Korzy\u015bci z tego na pewno s\u0105. Jasne jest, \u017ce nawet przy niewystarczaj\u0105cym przestrzeganiu zasad pracy w parach, sam fakt wsp\u00f3lnego wykonywania zada\u0144 pozytywnie wp\u0142ywa na jako\u015b\u0107 wyniku. Osobi\u015bcie w parze pracuje mi si\u0119 \u0142atwiej i przyjemniej.<\/p>\n<p>Bardziej zaawansowane sposoby wp\u0142ywania na system operacyjny \u2013 planowanie i praca z zadaniami na pewno przynosz\u0105 efekty: jako\u015bciowa wymiana wiedzy i poprawa jako\u015bci procesu tworzenia oprogramowania. <\/p>\n<h4>Kr\u00f3tka konkluzja w jednej linii <\/h4>\n<p><\/p>\n<ul>\n<li>Praktyki XP funkcjonuj\u0105 w IaC, ale z mniejsz\u0105 efektywno\u015bci\u0105.<\/li>\n<li>Wzmacniaj to, co dzia\u0142a.<\/li>\n<li>Tw\u00f3rz w\u0142asne mechanizmy kompensacyjne i praktyki.<\/li>\n<\/ul>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzaio\/blog\/470620\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0420\u0430\u043d\u044c\u0448\u0435 \u044f \u0436\u0430\u043b\u043e\u0432\u0430\u043b\u0441\u044f \u043d\u0430 \u0436\u0438\u0437\u043d\u044c \u0432 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0435 Infrastructure as code \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u043b \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0441\u043b\u043e\u0436\u0438\u0432\u0448\u0435\u0439\u0441\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0432\u0435\u0440\u043d\u0443\u043b\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u0440\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0437 \u0431\u0435\u0437\u0434\u043d\u044b \u043e\u0442\u0447\u0430\u044f\u043d\u0438\u044f \u0438 \u0432\u044b\u0440\u0443\u043b\u0438\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0440\u0443\u0441\u043b\u043e. \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u00abInfrastructure as code: \u043f\u0435\u0440\u0432\u043e\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e\u00bb \u044f \u0434\u0435\u043b\u0438\u043b\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u0435\u043c \u043e\u0442 \u044d\u0442\u043e\u0439 \u0441\u0444\u0435\u0440\u044b, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":29066,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-38747","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=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0420\u0430\u043d\u044c\u0448\u0435 \u044f \u0436\u0430\u043b\u043e\u0432\u0430\u043b\u0441\u044f \u043d\u0430 \u0436\u0438\u0437\u043d\u044c \u0432 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0435 Infrastructure as code \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u043b \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0441\u043b\u043e\u0436\u0438\u0432\u0448\u0435\u0439\u0441\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438.\" \/>\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\/infrastructure-as-code-kak-poborot-problemy-s-pomoshhyu-xp\" \/>\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\udd47Infrastructure as Code: \u043a\u0430\u043a \u043f\u043e\u0431\u043e\u0440\u043e\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e XP | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0420\u0430\u043d\u044c\u0448\u0435 \u044f \u0436\u0430\u043b\u043e\u0432\u0430\u043b\u0441\u044f \u043d\u0430 \u0436\u0438\u0437\u043d\u044c \u0432 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0435 Infrastructure as code \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u043b \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0441\u043b\u043e\u0436\u0438\u0432\u0448\u0435\u0439\u0441\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/infrastructure-as-code-kak-poborot-problemy-s-pomoshhyu-xp\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:25:42+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:25:42+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\udd47Infrastructure as Code: jak pokona\u0107 problemy za pomoc\u0105 XP | ProHoster","description":"Cze\u015b\u0107, Habr! Kiedy\u015b narzeka\u0142em na \u017cycie w paradygmacie Infrastructure as Code i nic nie proponowa\u0142em, aby rozwi\u0105za\u0107 obecn\u0105 sytuacj\u0119.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/infrastructure-as-code-kak-poborot-problemy-s-pomoshhyu-xp","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\udd47Infrastructure as Code: \u043a\u0430\u043a \u043f\u043e\u0431\u043e\u0440\u043e\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e XP | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0420\u0430\u043d\u044c\u0448\u0435 \u044f \u0436\u0430\u043b\u043e\u0432\u0430\u043b\u0441\u044f \u043d\u0430 \u0436\u0438\u0437\u043d\u044c \u0432 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0435 Infrastructure as code \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u043b \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0441\u043b\u043e\u0436\u0438\u0432\u0448\u0435\u0439\u0441\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/infrastructure-as-code-kak-poborot-problemy-s-pomoshhyu-xp","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:25:42+00:00","article:modified_time":"2019-10-31T19:25:42+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"38747","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 23:16:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:04:30","updated":"2026-01-23 23:16:19","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\/38747","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=38747"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/38747\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/29066"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=38747"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=38747"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=38747"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}