{"id":34841,"date":"2019-10-31T22:00:43","date_gmt":"2019-10-31T19:00:43","guid":{"rendered":"https:\/\/prohoster.info\/blog\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible\/"},"modified":"2019-10-31T22:00:43","modified_gmt":"2019-10-31T19:00:43","slug":"avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible","title":{"rendered":"Automatyzacja wymiany dysk\u00f3w za pomoc\u0105 Ansible","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Automatyzacja wymiany dysk\u00f3w za pomoc\u0105 Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/c60a2326ab13e7766eafda3ae5ac39c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCze\u015b\u0107 wszystkim. Pracuj\u0119 jako g\u0142\u00f3wny administrator system\u00f3w w OK i odpowiadam za stabilne dzia\u0142anie portalu. Chc\u0119 opowiedzie\u0107, jak zorganizowali\u015bmy proces automatycznej wymiany dysk\u00f3w, a nast\u0119pnie, jak wyeliminowali\u015bmy administratora z tego procesu, zast\u0119puj\u0105c go botem.<\/p>\n<p>Ten artyku\u0142 jest swoist\u0105 transliteracj\u0105 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=5WhbG3FQveE&amp;list=FLKN7KW1sxju7fWJvKuyKxEQ\">wyst\u0105pienia<\/a><\/noindex> na HighLoad+ 2018<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Budowanie procesu wymiany dysk\u00f3w<\/h2>\n<p><\/p>\n<h3>Najpierw kilka cyfr<\/h3>\n<p>\nOK to gigantyczny serwis, z kt\u00f3rego korzystaj\u0105 miliony ludzi. Obs\u0142uguje go oko\u0142o 7 tys. serwer\u00f3w rozmieszczonych w 4 r\u00f3\u017cnych centrach danych. Na serwerach znajduje si\u0119 ponad 70 tys. dysk\u00f3w. Gdyby je u\u0142o\u017cy\u0107 jeden na drugim, powsta\u0142a by wie\u017ca o wysoko\u015bci ponad 1 km. <\/p>\n<p>Dyski twarde to komponent serwera, kt\u00f3ry psuje si\u0119 najcz\u0119\u015bciej. Przy takich ilo\u015bciach musimy wymienia\u0107 oko\u0142o 30 dysk\u00f3w tygodniowo, a ta procedura sta\u0142a si\u0119 do\u015b\u0107 nieprzyjemn\u0105 rutyn\u0105.<\/p>\n<p><img decoding=\"async\" alt=\"Automatyzacja wymiany dysk\u00f3w za pomoc\u0105 Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/5e915e9077994efcc4e74a26fc6286fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Incydenty<\/h3>\n<p>\nW naszej firmie wprowadzono pe\u0142noprawny zarz\u0105d niemal wszystkimi incydentami. Ka\u017cdy incydent rejestrujemy w Jira, a nast\u0119pnie rozwi\u0105zujemy i omawiamy. Je\u015bli incydent mia\u0142 wp\u0142yw na u\u017cytkownik\u00f3w, koniecznie si\u0119 spotykamy i zastanawiamy, jak szybciej reagowa\u0107 w takich sytuacjach, jak zminimalizowa\u0107 wp\u0142yw i oczywi\u015bcie jak zapobiega\u0107 powt\u00f3rkom.<\/p>\n<p>No\u015bniki nie s\u0105 wyj\u0105tkiem. Ich stan monitoruje Zabbix. \u015aledzimy wiadomo\u015bci w Syslog pod k\u0105tem b\u0142\u0119d\u00f3w zapisu\/odczytu, analizujemy stan HW\/SW macierzy, monitorujemy SMART, a dla SSD obliczamy zu\u017cycie. <\/p>\n<h3>Jak przebiega\u0142a wymiana dysk\u00f3w wcze\u015bniej<\/h3>\n<p>\nKiedy w Zabbix zapala si\u0119 jaki\u015b wyzwalacz, w Jira tworzy si\u0119 incydent, kt\u00f3ry automatycznie przypisuje si\u0119 do odpowiednich in\u017cynier\u00f3w w centrach danych. Tak robimy ze wszystkimi incydentami sprz\u0119towymi, czyli takimi, kt\u00f3re wymagaj\u0105 jakiejkolwiek pracy fizycznej z urz\u0105dzeniami w centrum danych. <br \/>\nIn\u017cynier centrum danych to osoba, kt\u00f3ra zajmuje si\u0119 kwestiami zwi\u0105zanymi ze sprz\u0119tem, odpowiada za instalacj\u0119, konserwacj\u0119, demonta\u017c serwer\u00f3w. Otrzymuj\u0105c zg\u0142oszenie, in\u017cynier przyst\u0119puje do pracy. W szafach dyskowych wymienia dyski samodzielnie. Jednak je\u015bli nie ma dost\u0119pu do potrzebnego urz\u0105dzenia, in\u017cynier zwraca si\u0119 o pomoc do dy\u017curnych administrator\u00f3w system\u00f3w. W pierwszej kolejno\u015bci trzeba wy\u0142\u0105czy\u0107 dysk z rotacji. W tym celu nale\u017cy wprowadzi\u0107 odpowiednie zmiany na serwerze, zatrzyma\u0107 aplikacje, odmontowa\u0107 dysk.<\/p>\n<p>Dy\u017curny administrator system\u00f3w odpowiada za dzia\u0142anie ca\u0142ego portalu w czasie swojej zmiany roboczej. Rozwi\u0105zuje incydenty, zajmuje si\u0119 naprawami, wspiera programist\u00f3w w wykonywaniu drobnych zada\u0144. Nie zajmuje si\u0119 jedynie dyskami twardymi.<\/p>\n<p>Dawniej in\u017cynierowie centr\u00f3w danych komunikowali si\u0119 z administratorem system\u00f3w na czacie. In\u017cynierowie wysy\u0142ali linki do ticket\u00f3w Jira, a administrator przechodzi\u0142 przez nie, prowadz\u0105c dziennik prac w jakim\u015b notatniku. Jednak czaty nie s\u0105 wygodne na takie zadania: informacje s\u0105 tam nieustrukturyzowane i szybko gin\u0105. Administrator m\u00f3g\u0142 te\u017c po prostu odej\u015b\u0107 od komputera i przez pewien czas nie odpowiada\u0107 na zapytania, podczas gdy in\u017cynier sta\u0142 przy serwerze z paczk\u0105 dysk\u00f3w i czeka\u0142.<\/p>\n<p>Najgorsze by\u0142o to, \u017ce administratorzy nie widzieli pe\u0142nego obrazu: jakie wyst\u0119puj\u0105 incydenty dyskowe, gdzie potencjalnie mo\u017ce pojawi\u0107 si\u0119 problem. To zwi\u0105zane jest z tym, \u017ce wszystkie incydenty HW przekazujemy in\u017cynierom. Tak, mo\u017cna by\u0142o przedstawi\u0107 wszystkie incydenty na pulpicie administratora. Ale by\u0142o ich bardzo du\u017co, a administrator zajmowa\u0142 si\u0119 tylko niekt\u00f3rymi z nich.<\/p>\n<p>Ponadto, in\u017cynier nie m\u00f3g\u0142 prawid\u0142owo ustali\u0107 priorytet\u00f3w, poniewa\u017c nic nie wiedzia\u0142 o przeznaczeniu konkretnych serwer\u00f3w ani o rozk\u0142adzie informacji na no\u015bnikach.<\/p>\n<h3>Nowa procedura wymiany<\/h3>\n<p>\nPierwsz\u0105 rzecz\u0105, jak\u0105 zrobili\u015bmy, to wyodr\u0119bnili\u015bmy wszystkie incydenty dyskowe do osobnego typu \u201eHW-dysk\u201d i dodali\u015bmy do niego pola \u201enazwa urz\u0105dzenia blokowego\u201d, \u201erozmiar\u201d i \u201etyp dysku\u201d, aby te informacje by\u0142y zapisywane w tickecie, a nie trzeba by\u0142o ich ci\u0105gle wymienia\u0107 w czacie. <\/p>\n<p><img decoding=\"async\" alt=\"Automatyzacja wymiany dysk\u00f3w za pomoc\u0105 Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/c4526bf668e31d90e0fbd061de44f1a7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPonadto ustalili\u015bmy, \u017ce w ramach jednego incydentu b\u0119dziemy wymienia\u0107 tylko jeden dysk. To znacznie upro\u015bci\u0142o p\u00f3\u017aniejszy proces automatyzacji, zbierania statystyk i pracy. <\/p>\n<p>Dodatkowo dodali\u015bmy pole \u201eodpowiedzialny administrator\u201d. Tam automatycznie przypisuje si\u0119 dy\u017curnego admina. To bardzo wygodne, poniewa\u017c teraz in\u017cynier zawsze widzi, kto jest odpowiedzialny. Nie trzeba przeszukiwa\u0107 kalendarza. To w\u0142a\u015bnie to pole pozwoli\u0142o wy\u015bwietli\u0107 na pulpicie administratora tickety, w kt\u00f3rych by\u0107 mo\u017ce b\u0119dzie potrzebna jego pomoc.<\/p>\n<p><img decoding=\"async\" alt=\"Automatyzacja wymiany dysk\u00f3w za pomoc\u0105 Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/5097e5dcca1fddd68d1e5f296c09f60a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAby wszyscy uczestnicy mogli maksymalnie skorzysta\u0107 z innowacji, stworzyli\u015bmy filtry i pulpity nawigacyjne, a nast\u0119pnie om\u00f3wili\u015bmy je z zespo\u0142em. Kiedy ludzie rozumiej\u0105 zmiany, nie dystansuj\u0105 si\u0119 od nich jak od czego\u015b niepotrzebnego. In\u017cynier musi wiedzie\u0107, kt\u00f3ry numer szafy mie\u015bci serwer oraz rozmiar i typ dysku. Administrator, przede wszystkim, powinien rozumie\u0107, czym jest grupa serwer\u00f3w oraz jaki mo\u017ce by\u0107 efekt wymiany dysku.<\/p>\n<p>Obecno\u015b\u0107 p\u00f3l i ich wy\u015bwietlanie to wygodne rozwi\u0105zanie, ale nie uwolni\u0142o nas od konieczno\u015bci korzystania z czat\u00f3w. W tym celu musieli\u015bmy zmieni\u0107 proces pracy. <\/p>\n<p>Dawniej wygl\u0105da\u0142o to tak:<\/p>\n<p><img decoding=\"async\" alt=\"Automatyzacja wymiany dysk\u00f3w za pomoc\u0105 Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/2b79cdb7ec88b5ae3d2917ad8b164c6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDzi\u015b w taki spos\u00f3b wci\u0105\u017c pracuj\u0105 in\u017cynierowie, gdy nie potrzebuj\u0105 pomocy administratora.<\/p>\n<p>Pierwsz\u0105 rzecz\u0105, kt\u00f3r\u0105 zrobili\u015bmy, by\u0142o wprowadzenie nowego statusu <b>Investigate<\/b>. W tym statusie zg\u0142oszenie znajduje si\u0119, kiedy in\u017cynier jeszcze nie zdecydowa\u0142, czy potrzebuje administratora, czy nie. Poprzez ten status in\u017cynier mo\u017ce przekaza\u0107 zg\u0142oszenie administratorowi. Opr\u00f3cz tego tym statusem oznaczamy zg\u0142oszenia, kiedy wymagana jest wymiana dysku, ale sam dysk nie jest dost\u0119pny na platformie. Takie sytuacje zdarzaj\u0105 si\u0119 w przypadku CDN i zdalnych lokalizacji.<\/p>\n<p>Dodatkowo dodali\u015bmy status <b>Gotowy<\/b>. Do tego statusu zg\u0142oszenie jest przenoszone po wymianie dysku. Oznacza to, \u017ce wszystko zosta\u0142o ju\u017c zrobione, ale serwer synchronizuje HW\/SW RAID. Mo\u017ce to zaj\u0105\u0107 do\u015b\u0107 du\u017co czasu.<\/p>\n<p>Je\u015bli do pracy anga\u017cowany jest administrator, schemat nieco si\u0119 komplikuje.<\/p>\n<p><img decoding=\"async\" alt=\"Automatyzacja wymiany dysk\u00f3w za pomoc\u0105 Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/5b6aacbb0d4049e62e7cb9ee28eb6498.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nZ statusu <b>Otw\u00f3rz<\/b> zg\u0142oszenie mo\u017ce przenie\u015b\u0107 zar\u00f3wno administrator systemu, jak i in\u017cynier. W statusie <b>In progress<\/b> administrator wyjmuje dysk z rotacji, aby in\u017cynier m\u00f3g\u0142 go po prostu wyj\u0105\u0107: w\u0142\u0105cza pod\u015bwietlenie, odmontowuje dysk, zatrzymuje aplikacje w zale\u017cno\u015bci od konkretnej grupy serwer\u00f3w.<\/p>\n<p>Nast\u0119pnie zg\u0142oszenie przenoszone jest do <b>Ready to change<\/b>: to sygna\u0142 dla in\u017cyniera, \u017ce dysk mo\u017cna wyj\u0105\u0107. Wszystkie pola w Jira s\u0105 ju\u017c wype\u0142nione, in\u017cynier wie, jaki typ i rozmiar dysku. Te dane s\u0105 wprowadzane automatycznie w poprzednim statusie lub przez administratora.<\/p>\n<p>Po wymianie dysku zg\u0142oszenie jest przenoszone do statusu <b>Changed<\/b>. Sprawdzane jest, czy w\u0142o\u017cono w\u0142a\u015bciwy dysk, wykonuje si\u0119 partycjonowanie, uruchamia aplikacj\u0119 oraz wykonuje okre\u015blone zadania zwi\u0105zane z przywracaniem danych. Zg\u0142oszenie mo\u017ce tak\u017ce by\u0107 przeniesione do statusu <b>Gotowy<\/b>, w tym przypadku odpowiedzialno\u015b\u0107 pozostaje po stronie administratora, poniewa\u017c to on wprowadza\u0142 dysk do rotacji. Pe\u0142ny schemat wygl\u0105da tak.<\/p>\n<p><img decoding=\"async\" alt=\"Automatyzacja wymiany dysk\u00f3w za pomoc\u0105 Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/32f8d488e2ff6a28a3341114b66de0a3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDodanie nowych p\u00f3l znacznie u\u0142atwi\u0142o nam \u017cycie. Ch\u0142opaki zacz\u0119li pracowa\u0107 ze zorganizowanymi informacjami, a teraz wyra\u017anie wida\u0107, co i na jakim etapie nale\u017cy zrobi\u0107. Priorytety sta\u0142y si\u0119 znacznie bardziej relewantne, poniewa\u017c teraz ustawia je administrator.<\/p>\n<p>Znikn\u0119\u0142a potrzeba rozm\u00f3w na czacie. Oczywi\u015bcie administrator mo\u017ce napisa\u0107 in\u017cynierowi \"tu trzeba szybciej wymieni\u0107\" lub \"ju\u017c wiecz\u00f3r, zd\u0105\u017cysz wymieni\u0107?\". Ale ju\u017c nie rozmawiamy codziennie na czat dotycz\u0105cy tych kwestii.<\/p>\n<p>Dyski zacz\u0119to wymienia\u0107 hurtowo. Je\u015bli administrator przychodzi do pracy troch\u0119 wcze\u015bniej, ma troch\u0119 wolnego czasu, a jeszcze nic si\u0119 nie sta\u0142o, mo\u017ce przygotowa\u0107 szereg serwer\u00f3w do wymiany: ustawi\u0107 pola, wy\u0142\u0105czy\u0107 dyski z rotacji i przekaza\u0107 zadanie in\u017cynierowi. In\u017cynier przychodzi p\u00f3\u017aniej do centrum danych, widzi zadanie, zabiera z magazynu potrzebne dyski i od razu wymienia. W rezultacie zwi\u0119kszy\u0142a si\u0119 szybko\u015b\u0107 wymiany.<\/p>\n<h3>Do\u015bwiadczenie wyniesione przy budowie Workflow<\/h3>\n<p><\/p>\n<ul>\n<li><b>Przy tworzeniu procedury nale\u017cy zbiera\u0107 informacje z r\u00f3\u017cnych \u017ar\u00f3de\u0142.<\/b><br \/>\nNiekt\u00f3rzy nasi administratorzy nie wiedzieli, \u017ce in\u017cynier samodzielnie wymienia dyski. Niekt\u00f3rzy uwa\u017cali, \u017ce in\u017cynierowie monitoruj\u0105 synchronizacj\u0119 MD RAID, chocia\u017c niekt\u00f3rzy z nich nie mieli nawet do tego dost\u0119pu. Niekt\u00f3rzy g\u0142\u00f3wni in\u017cynierowie to robili, ale nie zawsze, poniewa\u017c proces nie by\u0142 nigdzie opisany.<\/li>\n<li><b>Procedura powinna by\u0107 prosta i zrozumia\u0142a.<\/b><br \/>\nCz\u0142owiekowi trudno jest utrzyma\u0107 w g\u0142owie wiele krok\u00f3w. Najwa\u017cniejsze s\u0105siednie statusy w Jira nale\u017cy przenie\u015b\u0107 na g\u0142\u00f3wny ekran. Mo\u017cna je nazywa\u0107 inaczej, na przyk\u0142ad, w toku nazywamy Gotowe do zmiany. A inne statusy mo\u017cna ukry\u0107 w wyskakuj\u0105cym menu, aby nie przeszkadza\u0142y w pracy. Ale lepiej nie ogranicza\u0107 ludzi, da\u0107 im mo\u017cliwo\u015b\u0107 dokonywania przej\u015b\u0107.<br \/>\nWyja\u015bniaj warto\u015b\u0107 innowacji. Kiedy ludzie rozumiej\u0105, lepiej przyjmuj\u0105 now\u0105 procedur\u0119. Dla nas by\u0142o bardzo wa\u017cne, aby ludzie nie klikali przez ca\u0142y proces, a szli zgodnie z nim. Nast\u0119pnie oparli\u015bmy na tym automatyzacj\u0119.<\/li>\n<li><b>Czeka\u0107, analizowa\u0107, rozwi\u0105zywa\u0107.<\/b><br \/>\nZaj\u0119\u0142o nam oko\u0142o miesi\u0105ca zbudowanie procedury, realizacj\u0119 techniczn\u0105, spotkania i dyskusje. A wdro\u017cenie zaj\u0119\u0142o ponad trzy miesi\u0105ce. Widzia\u0142em, jak ludzie powoli zaczynaj\u0105 korzysta\u0107 z innowacji. Na pocz\u0105tku by\u0142o du\u017co negatywnych opinii. Ale nie mia\u0142o to absolutnie nic wsp\u00f3lnego z sam\u0105 procedur\u0105 czy jej realizacj\u0105 techniczn\u0105. Na przyk\u0142ad, jeden z administrator\u00f3w korzysta\u0142 z wtyczki Jira w Confluence, a nie z samej Jira, przez co niekt\u00f3re rzeczy by\u0142y dla niego niedost\u0119pne. Po pokazaniu mu Jira, jego produktywno\u015b\u0107 wzros\u0142a zar\u00f3wno w sprawach og\u00f3lnych, jak i przy wymianie dysk\u00f3w.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Automatyzacja wymiany dysk\u00f3w<\/h2>\n<p>\nDo automatyzacji wymiany dysk\u00f3w podchodzili\u015bmy kilka razy. Mieli\u015bmy ju\u017c opracowania, skrypty, ale wszystkie dzia\u0142a\u0142y w trybie interaktywnym lub r\u0119cznym, co wymaga\u0142o uruchomienia. Dopiero po wdro\u017ceniu nowej procedury zrozumieli\u015bmy, \u017ce w\u0142a\u015bnie tego nam brakowa\u0142o.<\/p>\n<p>Teraz, gdy proces wymiany jest podzielony na etapy, z okre\u015blonym wykonawc\u0105 i list\u0105 dzia\u0142a\u0144 dla ka\u017cdego z nich, mo\u017cemy stopniowo w\u0142\u0105cza\u0107 automatyzacj\u0119, a nie od razu w ca\u0142o\u015bci. Na przyk\u0142ad, najprostszy etap \u2014 Ready (sprawdzenie synchronizacji RAID\/danych) mo\u017cna \u0142atwo delegowa\u0107 botowi. Kiedy bot troch\u0119 si\u0119 nauczy, mo\u017cna mu da\u0107 bardziej odpowiedzialne zadanie \u2014 wprowadzenie dysku do rotacji itd.<\/p>\n<h3>ZOO konfiguracji<\/h3>\n<p>\nZanim opowiem o bocie, zr\u00f3bmy ma\u0142y wst\u0119p do naszego zoo instalacji. Przede wszystkim jest to spowodowane ogromnym rozmiarem naszej infrastruktury. Po drugie, dla ka\u017cdego serwisu staramy si\u0119 dobra\u0107 optymaln\u0105 konfiguracj\u0119 sprz\u0119tu. Mamy oko\u0142o 20 modeli sprz\u0119towego RAID, g\u0142\u00f3wnie LSI i Adaptec, ale pojawiaj\u0105 si\u0119 tak\u017ce HP i DELL w r\u00f3\u017cnych wersjach. Ka\u017cdy kontroler RAID ma swoj\u0105 w\u0142asn\u0105 aplikacj\u0119 zarz\u0105dzaj\u0105c\u0105. Zestaw polece\u0144 i wydania mog\u0105 si\u0119 r\u00f3\u017cni\u0107 w zale\u017cno\u015bci od wersji ka\u017cdego kontrolera RAID. Tam, gdzie nie u\u017cywa si\u0119 HW-RAID, mo\u017ce by\u0107 mdraid.<\/p>\n<p>Praktycznie wszystkie nowe instalacje wykonujemy bez rezerwacji dyskowej. Staramy si\u0119 coraz wi\u0119cej nie u\u017cywa\u0107 sprz\u0119towego i programowego RAID, poniewa\u017c rezerwujemy nasze systemy na poziomie centr\u00f3w danych, a nie serwer\u00f3w. Oczywi\u015bcie, s\u0105 te\u017c liczne serwery starych generacji, kt\u00f3re musimy utrzymywa\u0107.<\/p>\n<p>Gdzie\u015b dyski w kontrolerach RAID s\u0105 pod\u0142\u0105czane jako raw, a gdzie indziej u\u017cywane s\u0105 JBOD. S\u0105 konfiguracje z jednym dyskiem systemowym w serwerze, i gdy trzeba go wymieni\u0107, nale\u017cy ponownie zainstalowa\u0107 system operacyjny i aplikacje, a tak\u017ce te same wersje, nast\u0119pnie doda\u0107 pliki konfiguracyjne i uruchomi\u0107 aplikacje. Istnieje r\u00f3wnie\u017c wiele grup serwer\u00f3w, gdzie zabezpieczenie odbywa si\u0119 nie na poziomie systemu dyskowego, lecz bezpo\u015brednio w samych aplikacjach.<\/p>\n<p>\u0141\u0105cznie mamy ponad 400 unikalnych grup serwer\u00f3w, na kt\u00f3rych dzia\u0142a oko\u0142o 100 r\u00f3\u017cnych aplikacji. Aby pokry\u0107 tak ogromn\u0105 liczb\u0119 wariant\u00f3w, potrzebowali\u015bmy wielofunkcyjnego narz\u0119dzia automatyzacji. Najlepiej z prostym DSL, aby m\u00f3g\u0142 to wspiera\u0107 nie tylko ten, kto to napisa\u0142.<\/p>\n<p>Wybrali\u015bmy Ansible, poniewa\u017c jest bezagentowy: nie trzeba by\u0142o przygotowywa\u0107 infrastruktury, szybki start. Ponadto jest napisany w Pythonie, kt\u00f3ry zosta\u0142 przyj\u0119ty jako standard w zespole.<\/p>\n<h3>Og\u00f3lny schemat<\/h3>\n<p>\nPrzyjrzyjmy si\u0119 og\u00f3lnemu schematowi automatyzacji na przyk\u0142adzie jednego incydentu. Zabbix wykrywa, \u017ce dysk sdb uleg\u0142 awarii, uruchamia si\u0119 wyzwalacz, tworzony jest ticket w Jira. Administrator przegl\u0105da go, zdaje sobie spraw\u0119, \u017ce nie jest to duplikat ani false positive, to znaczy trzeba wymieni\u0107 dysk, i przenosi tiket do statusu In progress.<\/p>\n<p><img decoding=\"async\" alt=\"Automatyzacja wymiany dysk\u00f3w za pomoc\u0105 Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/673df0fe9600bc65633841222f436d37.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAplikacja DiskoBot, napisana w Pythonie, okresowo sprawdza Jira pod k\u0105tem nowych ticket\u00f3w. Zauwa\u017ca, \u017ce pojawi\u0142 si\u0119 nowy ticket w statusie In progress, wyzwalany jest odpowiedni w\u0105tek, kt\u00f3ry uruchamia playbook w Ansible (jest to robione dla ka\u017cdego statusu w Jira). W tym przypadku uruchamiane jest Prepare2change.<\/p>\n<p>Ansible \u0142\u0105czy si\u0119 z hostem, wypina dysk z rotacji i zg\u0142asza status aplikacji przez Callbacks. <\/p>\n<p><img decoding=\"async\" alt=\"Automatyzacja wymiany dysk\u00f3w za pomoc\u0105 Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/8bfc13129f8deca640eb63ea81f616c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNa podstawie wynik\u00f3w bot automatycznie przenosi ticket do Ready to change. In\u017cynier otrzymuje powiadomienie i idzie wymieni\u0107 dysk, po czym przenosi ticket do Changed. <\/p>\n<p><img decoding=\"async\" alt=\"Automatyzacja wymiany dysk\u00f3w za pomoc\u0105 Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/eeda06b6966f435e2172d3f9c61b341e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNa podstawie opisanego schematu ticket wraca do bota, kt\u00f3ry uruchamia inny playbook, idzie na hosta i wprowadza dysk do rotacji. Bot zamyka ticket. Hurra!<\/p>\n<p><img decoding=\"async\" alt=\"Automatyzacja wymiany dysk\u00f3w za pomoc\u0105 Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/51b8c7050b0c10c16ad6a6d4974c3ebf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTeraz porozmawiajmy o niekt\u00f3rych komponentach systemu.<\/p>\n<h3>Diskobot<\/h3>\n<p>\nTa aplikacja jest napisana w Pythonie. Wybiera tickety z Jira zgodnie z JQL. W zale\u017cno\u015bci od statusu ticketu, trafia on do odpowiedniego handlera, kt\u00f3ry nast\u0119pnie uruchamia odpowiedni playbook Ansible zgodny ze statusem.<\/p>\n<p>JQL i interwa\u0142y zapyta\u0144 s\u0105 zdefiniowane w pliku konfiguracyjnym aplikacji.<\/p>\n<pre><code class=\"plaintext\">jira_states:\n  investigate:\n    jql: '\u2026 status = Open i \"Disk Size\" jest PUSTY'\n    interval: 180\n\n  inprogress:\n    jql: '\u2026  i \"Disk Size\" nie jest PUSTY i \"Device Name\" nie jest PUSTY'\n \n  ready:\n    jql: '\u2026 i (labels nie w (\"dbot_ignore\") lub labels jest PUSTY)'\n    interval: 7200\n<\/code><\/pre>\n<p>\nNa przyk\u0142ad, w\u015br\u00f3d zg\u0142osze\u0144 w statusie In progress wybierane s\u0105 tylko te, kt\u00f3re maj\u0105 wype\u0142nione pola Disk size i Device name. Device name to nazwa urz\u0105dzenia blokowego, kt\u00f3re jest potrzebne do wykonania playbooka. Disk size jest potrzebny, aby in\u017cynier wiedzia\u0142, jakiej wielko\u015bci dysku potrzebuje.<\/p>\n<p>W przypadku zg\u0142osze\u0144 ze statusem Ready filtrujemy zg\u0142oszenia z etykiet\u0105 dbot_ignore. Swoj\u0105 drog\u0105, etykiety w Jira u\u017cywamy zar\u00f3wno do takiej filtracji, jak i do oznaczania zduplikowanych zg\u0142osze\u0144 oraz zbierania statystyk.<\/p>\n<p>W przypadku awarii playbooka Jira przypisuje etykiet\u0119 dbot_failed, aby p\u00f3\u017aniej mo\u017cna by\u0142o rozwi\u0105za\u0107 problem. <\/p>\n<h3>Interakcja z Ansible<\/h3>\n<p>\nAplikacja wsp\u00f3\u0142dzia\u0142a z Ansible poprzez <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/dev_guide\/developing_api.html\">Interfejs API Ansible Python<\/a><\/noindex>. W playbook_executor przekazujemy nazw\u0119 pliku oraz zestaw zmiennych. Pozwala to na przechowywanie projektu Ansible w postaci standardowych plik\u00f3w yml, a nie kodu Python. <\/p>\n<p>Tak\u017ce w Ansible przez *extra_vars* przekazujemy nazw\u0119 urz\u0105dzenia blokowego, status zg\u0142oszenia oraz callback_url, w kt\u00f3rym ukryty jest klucz zg\u0142oszenia \u2014 jest on u\u017cywany do callback\u00f3w w HTTP.<\/p>\n<p>Dla ka\u017cdego uruchomienia generowany jest tymczasowy inventarz, sk\u0142adaj\u0105cy si\u0119 z jednego hosta oraz grupy, do kt\u00f3rej nale\u017cy ten host, aby zastosowa\u0107 group_vars.<\/p>\n<p>Oto przyk\u0142ad zadania, w kt\u00f3rym zrealizowano HTTP callback.<\/p>\n<p>Wyniki wykonania playbook\u00f3w uzyskujemy za pomoc\u0105 callback\u00f3w. S\u0105 one dw\u00f3ch typ\u00f3w:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/plugins\/callback.html\">Wtyczka callback Ansible<\/a><\/noindex>, dostarcza danych dotycz\u0105cych wynik\u00f3w wykonywania playbooka. Opisuje zadania, kt\u00f3re zosta\u0142y uruchomione, zako\u0144czone powodzeniem lub niepowodzeniem. Ten callback jest wywo\u0142ywany po zako\u0144czeniu wykonywania playbooka.<\/li>\n<li>HTTP callback do pozyskiwania informacji w trakcie wykonywania playbooka. W zadaniu Ansible wykonujemy zapytanie POST\/GET w stron\u0119 naszej aplikacji.<\/li>\n<\/ul>\n<p>\nPrzez HTTP callbacki przekazywane s\u0105 zmienne, kt\u00f3re zosta\u0142y okre\u015blone podczas wykonywania playbooka i kt\u00f3re chcemy przechowa\u0107 oraz wykorzysta\u0107 w p\u00f3\u017aniejszych uruchomieniach. Dane te zapisujemy w sqlite.<\/p>\n<p>Tak\u017ce przez HTTP callback zostawiamy komentarze i zmieniamy status zg\u0142oszenia.<\/p>\n<p><b class=\"spoiler_title\">HTTP callback<\/b><\/p>\n<pre><code class=\"plaintext\"># Make callback to Diskobot App\n# Variables:\n#    callback_post_body: # A dict with follow keys. All keys are optional\n#       msg: If exist it would be posted to Jira as comment\n#       data: If exist it would be saved in Incident.variables\n#       desire_state: Set desire_state for incident\n#       status: If exist Proceed issue to that status\n\n  - name: Callback to Diskobot app (jira comment\/status)\n    uri:\n      url: \"{{ callback_url }}\/{{ devname }}\"\n      user: \"{{ diskobot_user }}\"\n      password: \"{{ diskobot_pass }}\"\n      force_basic_auth: True\n      method: POST\n      body: \"{{ callback_post_body | to_json }}\"\n      body_format: json\n    delegate_to: 127.0.0.1\n<\/code><\/pre>\n<p>Podobnie jak wiele innych zada\u0144, przenie\u015bli\u015bmy je do osobnego pliku wsp\u00f3lnego i w\u0142\u0105czamy w razie potrzeby, aby nie powtarza\u0107 ich ci\u0105gle w playbookach. Wyst\u0119puje tutaj callback_url, w kt\u00f3rym zakodowane s\u0105 klucz zg\u0142oszenia i nazwa hosta. Kiedy Ansible wykonuje ten POST-request, bot rozumie, \u017ce dotar\u0142 w ramach takiego incydentu.<\/p>\n<p>Oto przyk\u0142ad z playbooka, w kt\u00f3rym wy\u0142\u0105czali\u015bmy dysk z urz\u0105dzenia MD:<\/p>\n<pre><code class=\"plaintext\">  # Save mdadm configuration\n  - include: common\/callback.yml\n    vars:\n      callback_post_body:\n        status: 'Ready to change'\n        msg: \"Removed disk from mdraid {{ mdadm_remove_disk.msg | comment_jira }}\"\n        data:\n          mdadm_data: \"{{ mdadm_remove_disk.removed }}\"\n          parted_info: \"{{ parted_info | default() }}\"\n    when:\n      - mdadm_remove_disk | changed\n      - mdadm_remove_disk.removed\n<\/code><\/pre>\n<p>\nTo zadanie zmienia status zg\u0142oszenia Jira na \u201eGotowy do zmiany\u201d i dodaje komentarz. W zmiennej mdam_data zapisywana jest lista urz\u0105dze\u0144 md, z kt\u00f3rych usuni\u0119to dysk, a w parted_info - zrzut partycji z parted. <\/p>\n<p>Kiedy in\u017cynier w\u0142o\u017cy nowy dysk, b\u0119dziemy mogli wykorzysta\u0107 te zmienne, aby przywr\u00f3ci\u0107 zrzut partycji i doda\u0107 dysk do tych urz\u0105dze\u0144 md, z kt\u00f3rych zosta\u0142 usuni\u0119ty.<\/p>\n<h3>Tryb sprawdzania Ansible<\/h3>\n<p>\nW\u0142\u0105czenie automatyzacji by\u0142o przera\u017caj\u0105ce. Dlatego zdecydowali\u015bmy si\u0119 uruchamia\u0107 wszystkie playbooki w trybie <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_checkmode.html\">dry run<\/a><\/noindex>, w kt\u00f3rym Ansible nie wykonuje \u017cadnych dzia\u0142a\u0144 na serwerach, a jedynie je emuluje. <\/p>\n<p>Takie uruchomienie jest realizowane przez osobny modu\u0142 callback, a wynik wykonania playbooka zostaje zapisany w Jira w postaci komentarza.<\/p>\n<p><img decoding=\"async\" alt=\"Automatyzacja wymiany dysk\u00f3w za pomoc\u0105 Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/b02d7f1dc428f2797ae8556cd496b115.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPo pierwsze, umo\u017cliwi\u0142o to walidacj\u0119 dzia\u0142ania bota i playbook\u00f3w. Po drugie, zwi\u0119kszy\u0142o zaufanie administrator\u00f3w do bota. <\/p>\n<p>Kiedy przeszli\u015bmy walidacj\u0119 i zrozumieli\u015bmy, \u017ce mo\u017cna uruchamia\u0107 Ansible nie tylko w trybie dry run, dodali\u015bmy w Jira przycisk Uruchom Diskobot do uruchamiania tego samego playbooka z tymi samymi zmiennymi na tym samym ho\u015bcie, ale w normalnym trybie. <\/p>\n<p>Ponadto przycisk s\u0142u\u017cy do ponownego uruchamiania playbooka w przypadku jego awarii.<\/p>\n<h3>Struktura Playbooks<\/h3>\n<p>\nJu\u017c wspomnia\u0142em, \u017ce w zale\u017cno\u015bci od statusu zg\u0142oszenia Jira, bot uruchamia r\u00f3\u017cne playbooki.<\/p>\n<p>Po pierwsze, u\u0142atwia to organizacj\u0119 wej\u015bcia. <br \/>\nPo drugie, w niekt\u00f3rych przypadkach jest to po prostu konieczne. <\/p>\n<p>Na przyk\u0142ad, podczas wymiany dysku systemowego najpierw nale\u017cy uda\u0107 si\u0119 do systemu wdra\u017cania, stworzy\u0107 zadanie, a po poprawnym wdro\u017ceniu serwer stanie si\u0119 dost\u0119pny przez ssh, i mo\u017cna na niego na\u0142o\u017cy\u0107 aplikacj\u0119. Gdyby\u015bmy wszystko to robili w jednym playbooku, Ansible nie by\u0142by w stanie go wykona\u0107 z powodu niedost\u0119pno\u015bci hosta.<\/p>\n<p>U\u017cywamy r\u00f3l Ansible dla ka\u017cdej grupy serwer\u00f3w. Tutaj wida\u0107, jak zorganizowane s\u0105 playbooki w jednej z nich. <\/p>\n<p><img decoding=\"async\" alt=\"Automatyzacja wymiany dysk\u00f3w za pomoc\u0105 Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/7a14035392b33f01d3182d5fff779321.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTo jest wygodne, poniewa\u017c od razu wiadomo, gdzie znajduj\u0105 si\u0119 poszczeg\u00f3lne zadania. W pliku main.yml, kt\u00f3ry jest g\u0142\u00f3wnym punktem wej\u015bcia dla roli Ansible, mo\u017cemy mie\u0107 po prostu includa wed\u0142ug statusu zg\u0142oszenia lub og\u00f3lne zadania, kt\u00f3re s\u0105 potrzebne dla wszystkich, na przyk\u0142ad przej\u015bcie identyfikacji lub uzyskanie tokena.<\/p>\n<h4>Investigation.yml<\/h4>\n<p>\nUruchamiany dla zg\u0142osze\u0144 w statusie Investigation i Open. Najwa\u017cniejsz\u0105 informacj\u0105 dla tego playbooka jest nazwa urz\u0105dzenia blokowego. Informacja ta nie zawsze jest dost\u0119pna. <\/p>\n<p>Aby j\u0105 uzyska\u0107, analizujemy podsumowanie w Jira, ostatni\u0105 warto\u015b\u0107 z wyzwalacza Zabbixa. Mo\u017ce tam by\u0107 zawarta nazwa urz\u0105dzenia blokowego \u2014 je\u015bli mamy szcz\u0119\u015bcie. Mo\u017ce te\u017c by\u0107 zawarty punkt monta\u017cu \u2014 wtedy musimy wej\u015b\u0107 na serwer, przeanalizowa\u0107 i obliczy\u0107 odpowiedni dysk. Wyzwalacz mo\u017ce r\u00f3wnie\u017c przekaza\u0107 adres scsi lub inne informacje. Mo\u017ce zdarzy\u0107 si\u0119 tak\u017ce, \u017ce nie ma \u017cadnych wskaz\u00f3wek i musimy szczeg\u00f3\u0142owo analizowa\u0107.<\/p>\n<p>Wyja\u015bniaj\u0105c nazw\u0119 urz\u0105dzenia blokowego, zbieramy informacje o typie i rozmiarze dysku, aby wype\u0142ni\u0107 pola w Jira. Zbieramy r\u00f3wnie\u017c dane o producencie, modelu, wersji oprogramowania, ID, SMART, a nast\u0119pnie wszystko to wstawiamy do komentarza w zg\u0142oszeniu Jira. Teraz administrator i in\u017cynier nie musz\u0105 szuka\u0107 tych informacji. \ud83d\ude42<\/p>\n<p><img decoding=\"async\" alt=\"Automatyzacja wymiany dysk\u00f3w za pomoc\u0105 Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/259bf8712c013ee00d238f111b4280fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>prepare2change.yml<\/h4>\n<p>\nWydanie dysku z rotacji, przygotowanie do wymiany. To najtrudniejszy i najodpowiedzialniejszy etap. W\u0142a\u015bnie tutaj mo\u017cna zatrzyma\u0107 aplikacj\u0119, kiedy nie mo\u017cna jej zatrzymywa\u0107. Lub wyj\u0105\u0107 dysk, z kt\u00f3rego brakowa\u0142o replik, co mo\u017ce wp\u0142yn\u0105\u0107 na u\u017cytkownik\u00f3w, straci\u0107 jakie\u015b dane. Tutaj mamy najwi\u0119cej kontroli i powiadomie\u0144 w czacie.<\/p>\n<p>W najprostszym przypadku chodzi o usuni\u0119cie dysku z HW\/MD RAID. <\/p>\n<p>W bardziej skomplikowanych sytuacjach (w naszych systemach pami\u0119ci), gdy replikacja jest realizowana na poziomie aplikacji, konieczne jest skorzystanie z API aplikacji, zg\u0142oszenie wydania dysku, dezaktywacja go i uruchomienie procesu odzyskiwania.<\/p>\n<p>Obecnie masowo migrujemy do <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/odnoklassniki\/blog\/346868\">chmury<\/a><\/noindex>, a je\u015bli serwer jest w chmurze, to Diskobot zwraca si\u0119 do API chmury, informuje, \u017ce zamierza pracowa\u0107 z tym minionkiem \u2014 serwerem, na kt\u00f3rym uruchomione s\u0105 kontenery \u2014 i prosi: \u201ezmigruj wszystkie kontenery z tego minionka\u201d. I przy okazji w\u0142\u0105cza pod\u015bwietlenie dysku, aby in\u017cynier od razu zobaczy\u0142, kt\u00f3ry trzeba wyj\u0105\u0107.<\/p>\n<h4>changed.yml<\/h4>\n<p>\nPo wymianie dysku najpierw sprawdzamy jego dost\u0119pno\u015b\u0107. <\/p>\n<p>In\u017cynierowie nie zawsze montuj\u0105 nowe dyski, dlatego dodali\u015bmy kontrol\u0119 spe\u0142niania przez nie wymaganych warto\u015bci SMART.<\/p>\n<p><b class=\"spoiler_title\">Jakie atrybuty analizujemy<\/b>Liczba przerzuconych sektor\u00f3w (5) &lt; 100<br \/>\nBie\u017c\u0105ca liczba oczekuj\u0105cych sektor\u00f3w (107) == 0<\/p>\n<p>Je\u015bli dysk nie przechodzi testu, in\u017cynier zostaje poinformowany o konieczno\u015bci wymiany. Je\u015bli wszystko jest w porz\u0105dku, pod\u015bwietlenie ga\u015bnie, nanosi si\u0119 oznaczenie i dysk zostaje wprowadzony do rotacji.<\/p>\n<h4>ready.yml<\/h4>\n<p>\nNajprostszy przypadek: sprawdzanie synchronizacji RAID HW\/SW lub zako\u0144czenie synchronizacji danych w aplikacji.<\/p>\n<h3>API aplikacji<\/h3>\n<p>\nWielokrotnie wspomina\u0142em, \u017ce bot cz\u0119sto korzysta z API aplikacji. Oczywi\u015bcie nie wszystkie aplikacje mia\u0142y wymagane metody, wi\u0119c trzeba by\u0142o je wdro\u017cy\u0107. Oto najwa\u017cniejsze metody, z kt\u00f3rych korzystamy:<\/p>\n<ul>\n<li>Status. Status klastra lub dysku, aby zrozumie\u0107, czy mo\u017cna z nim pracowa\u0107;\n<\/li>\n<li>Start\/stop. Aktywacja-dezaktywacja dysku;\n<\/li>\n<li>Migrate\/restore. Migracja i przywracanie danych w trakcie i po wymianie.\n<\/li>\n<\/ul>\n<p><\/p>\n<h3>Zebrane do\u015bwiadczenie dotycz\u0105ce Ansible<\/h3>\n<p>\nBardzo lubi\u0119 Ansible. Jednak cz\u0119sto, gdy patrz\u0119 na r\u00f3\u017cne projekty open source i widz\u0119, jak ludzie pisz\u0105 playbooki, czuj\u0119 si\u0119 nieco przestraszony. Z\u0142o\u017cone logiczne sploty z when\/loop, brak elastyczno\u015bci i idempotencji z powodu cz\u0119stego u\u017cywania shell\/command.<\/p>\n<p>Postanowili\u015bmy maksymalnie upro\u015bci\u0107 wszystko, korzystaj\u0105c z zalety Ansible \u2014 modu\u0142owo\u015bci. Na najwy\u017cszym poziomie znajduj\u0105 si\u0119 playbooki, kt\u00f3re mo\u017ce pisa\u0107 ka\u017cdy administrator, zewn\u0119trzny programista, kt\u00f3ry troch\u0119 zna Ansible.<\/p>\n<pre><code class=\"plaintext\">- name: Miga\u0107 dyskiem\n  become: True\n  register: locate_action\n  disk_locate:\n      locate: '{{ locate }}'\n      devname: '{{ devname }}'\n      ids: '{{ locate_ids | default(pd_id) | default(omit) }}'\n<\/code><\/pre>\n<p>Je\u015bli jak\u0105kolwiek logik\u0119 trudno zrealizowa\u0107 w playbookach, przenosimy j\u0105 do modu\u0142u Ansible lub filtru. Skrypty mog\u0105 by\u0107 napisane w Pythonie lub w innym j\u0119zyku. <\/p>\n<p>S\u0105 \u0142atwe i szybkie do napisania. Na przyk\u0142ad modu\u0142 pod\u015bwietlania dysku, kt\u00f3rego przyk\u0142ad u\u017cycia przedstawiono powy\u017cej, sk\u0142ada si\u0119 z 265 linii.<\/p>\n<p><img decoding=\"async\" alt=\"Automatyzacja wymiany dysk\u00f3w za pomoc\u0105 Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/08e0384bfad24f3ee61e0643ca087852.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNa najni\u017cszym poziomie znajduje si\u0119 biblioteka. Dla tego projektu napisali\u015bmy oddzieln\u0105 aplikacj\u0119, pewnego rodzaju abstrakcj\u0119 nad sprz\u0119towymi i programowymi RAID, kt\u00f3re wykonuj\u0105 odpowiednie zapytania. <\/p>\n<p><img decoding=\"async\" alt=\"Automatyzacja wymiany dysk\u00f3w za pomoc\u0105 Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/0edda3182026ce6279bd84c99613e3d6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNajsilniejszymi stronami Ansible s\u0105 prostota i zrozumia\u0142e playbooki. Uwa\u017cam, \u017ce nale\u017cy z tego korzysta\u0107 i nie generowa\u0107 przera\u017caj\u0105cych plik\u00f3w yaml oraz ogromnej ilo\u015bci warunk\u00f3w, kodu shell i p\u0119tli.<\/p>\n<p>Je\u015bli chcesz powt\u00f3rzy\u0107 nasze do\u015bwiadczenie z Ansible API, we\u017a pod uwag\u0119 dwie rzeczy:<\/p>\n<ul>\n<li>Playbook_executor i w og\u00f3le playbook nie pozwalaj\u0105 na przekazanie timeoutu. Jest timeout na sesji ssh, ale nie ma timeoutu na playbooku. Je\u015bli pr\u00f3bujemy odmontowa\u0107 dysk, kt\u00f3ry w systemie ju\u017c nie istnieje, playbook b\u0119dzie dzia\u0142a\u0142 w niesko\u0144czono\u015b\u0107, dlatego musieli\u015bmy owin\u0105\u0107 jego uruchomienie w oddzielny wrapper i zabija\u0107 go po timeoutcie.\n<\/li>\n<li>Ansible dzia\u0142a na bazie proces\u00f3w fork, dlatego jego API nie jest bezpieczne dla w\u0105tk\u00f3w. Uruchamiamy wszystkie nasze playbooki jednow\u0105tkowo.\n<\/li>\n<\/ul>\n<p>\nOstatecznie uda\u0142o nam si\u0119 zautomatyzowa\u0107 wymian\u0119 oko\u0142o 80% dysk\u00f3w. Og\u00f3lnie pr\u0119dko\u015b\u0107 wymiany wzros\u0142a dwukrotnie. Dzi\u015b administrator tylko obserwuje incydent i podejmuje decyzj\u0119, czy nale\u017cy wymieni\u0107 dysk, a nast\u0119pnie wykonuje jeden klik.<\/p>\n<p>Ale teraz zaczynamy napotyka\u0107 inny problem: niekt\u00f3rzy nowi administratorzy nie wiedz\u0105, jak wymienia\u0107 dyski. \ud83d\ude42<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/odnoklassniki\/blog\/452110\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442. \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432\u0435\u0434\u0443\u0449\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0432 \u041e\u041a \u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u044e \u0437\u0430 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043e\u0440\u0442\u0430\u043b\u0430. \u0425\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0432\u044b\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0437\u0430\u043c\u0435\u043d\u044b \u0434\u0438\u0441\u043a\u043e\u0432, \u0430 \u0437\u0430\u0442\u0435\u043c, \u043a\u0430\u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 \u0435\u0433\u043e \u0431\u043e\u0442\u043e\u043c. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u043e\u0434\u0430 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u0430 HighLoad+ 2018 \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043f\u043e \u0437\u0430\u043c\u0435\u043d\u0435 \u0434\u0438\u0441\u043a\u043e\u0432 \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":26233,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-34841","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=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442.\" \/>\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\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible\" \/>\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\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u043c\u0435\u043d\u044b \u0434\u0438\u0441\u043a\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Ansible | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible\" \/>\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:00:43+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:00:43+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\udd47Automatyzacja wymiany dysk\u00f3w za pomoc\u0105 Ansible | ProHoster","description":"Witajcie wszyscy.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible","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\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u043c\u0435\u043d\u044b \u0434\u0438\u0441\u043a\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Ansible | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible","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:00:43+00:00","article:modified_time":"2019-10-31T19:00:43+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"34841","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 20:48:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:14:05","updated":"2026-01-21 20:48: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\/34841","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=34841"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/34841\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/26233"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=34841"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=34841"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=34841"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}