{"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\/sv\/blog\/administrirovanie\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible","title":{"rendered":"Automatisering av diskbyten med hj\u00e4lp av Ansible","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Automatisering av diskbyten med hj\u00e4lp av Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/c60a2326ab13e7766eafda3ae5ac39c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHej alla. Jag arbetar som ledande systemadministrat\u00f6r p\u00e5 OK och ansvarar f\u00f6r portalen. Jag vill ber\u00e4tta om hur vi har byggt upp processen f\u00f6r automatisk byte av diskar, och hur vi sedan utesl\u00f6t administrat\u00f6ren fr\u00e5n denna process och ersatte honom med en bot.<\/p>\n<p>Den h\u00e4r artikeln \u00e4r en slags translitterering <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=5WhbG3FQveE&amp;list=FLKN7KW1sxju7fWJvKuyKxEQ\">presentation<\/a><\/noindex> till HighLoad+ 2018<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Byggande av processen f\u00f6r byte av diskar<\/h2>\n<p><\/p>\n<h3>F\u00f6rst lite siffror<\/h3>\n<p>\nOK \u00e4r en gigantisk tj\u00e4nst som anv\u00e4nds av miljontals m\u00e4nniskor. Den st\u00f6ds av cirka 7000 servrar som \u00e4r bel\u00e4gna i 4 olika datacenter. I servrarna finns \u00f6ver 70 000 diskar. Om man staplar dem ovanp\u00e5 varandra f\u00e5r man ett torn som \u00e4r mer \u00e4n 1 km h\u00f6gt. <\/p>\n<p>H\u00e5rddiskar \u00e4r den komponent i servern som oftast g\u00e5r s\u00f6nder. Med s\u00e5dan volym m\u00e5ste vi byta ut cirka 30 diskar varje vecka, och denna procedur har blivit en obehaglig rutin.<\/p>\n<p><img decoding=\"async\" alt=\"Automatisering av diskbyten med hj\u00e4lp av Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/5e915e9077994efcc4e74a26fc6286fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Incidenter<\/h3>\n<p>\nVi har i v\u00e5rt f\u00f6retag inf\u00f6rt en helt\u00e4ckande incidenthantering. Varje incident registrerar vi i Jira och l\u00f6ser och analyserar sedan. Om incidenten har p\u00e5verkat anv\u00e4ndarna samlas vi f\u00f6r att fundera p\u00e5 hur vi snabbare kan reagera i s\u00e5dana situationer, hur vi kan minska effekten, och sj\u00e4lvklart hur vi kan f\u00f6rhindra upprepning.<\/p>\n<p>Lagringsenheter \u00e4r inget undantag. Deras tillst\u00e5nd \u00f6vervakas av Zabbix. Vi bevakar meddelanden i Syslog f\u00f6r att uppt\u00e4cka skriv-\/l\u00e4serfel, analyserar tillst\u00e5ndet hos HW\/SW-RAID, och \u00f6vervakar SMART, samt ber\u00e4knar slitaget f\u00f6r SSD. <\/p>\n<h3>Hur diskar byttes tidigare<\/h3>\n<p>\nN\u00e4r en trigger t\u00e4nds i Zabbix skapas en incident i Jira och tilldelas automatiskt till de aktuella ingenj\u00f6rerna i datacentren. Detta g\u00f6r vi f\u00f6r alla HW-incidenter, det vill s\u00e4ga s\u00e5dana som kr\u00e4ver n\u00e5gon form av fysiskt arbete med utrustningen i datacentret. <br \/>\nIngenj\u00f6ren i datacentret \u00e4r en person som hanterar fr\u00e5gor relaterade till h\u00e5rdvaran, ansvarar f\u00f6r installation, underh\u00e5ll och demontering av servrar. N\u00e4r han f\u00e5r en biljett s\u00e4tter han ig\u00e5ng med arbetet. I diskhyllorna byter han ut diskarna sj\u00e4lv. Men om han inte har tillg\u00e5ng till r\u00e4tt enhet ber ingenj\u00f6ren jouransvariga systemadministrat\u00f6rer om hj\u00e4lp. F\u00f6rst m\u00e5ste disken tas ur rotation. F\u00f6r detta beh\u00f6ver man g\u00f6ra n\u00f6dv\u00e4ndiga \u00e4ndringar p\u00e5 servern, stoppa applikationerna och avmontera disken.<\/p>\n<p>Under den arbetsdagar \u00e4r den jourhavande systemadministrat\u00f6ren ansvarig f\u00f6r hela portalens funktion. Han utreder incidenter, utf\u00f6r reparationer och hj\u00e4lper utvecklarna med mindre uppgifter. Han arbetar inte med h\u00e5rddiskarna.<\/p>\n<p>Tidigare kommunicerade datacentertekniker med systemadministrat\u00f6ren via chatt. Teknikerna skickade l\u00e4nkar till Jira-biljetter, och administrat\u00f6ren gick igenom dem och f\u00f6rde en logg \u00f6ver arbetet i n\u00e5gon anteckningsbok. Men f\u00f6r s\u00e5dana uppgifter \u00e4r chattar besv\u00e4rliga: informationen \u00e4r ostrukturerad och g\u00e5r fort f\u00f6rlorad. Dessutom kunde administrat\u00f6ren enkelt g\u00e5 ifr\u00e5n datorn och vara otillg\u00e4nglig under en tid, medan teknikern stod vid servern med en h\u00f6g av diskar och v\u00e4ntade.<\/p>\n<p>Men det v\u00e4rsta var att administrat\u00f6rerna inte s\u00e5g hela bilden: vilka diskincidenter som fanns och var potentiella problem kunde uppst\u00e5. Detta beror p\u00e5 att vi l\u00e4mnar alla h\u00e5rdvaruincidenter till ingenj\u00f6rerna. Ja, man kunde visa alla incidenter p\u00e5 administrat\u00f6rens instrumentpanel, men de \u00e4r v\u00e4ldigt m\u00e5nga, och administrat\u00f6ren involverades endast i vissa av dem.<\/p>\n<p>Dessutom kunde ingenj\u00f6ren inte korrekt prioritera, eftersom han inte visste n\u00e5got om syftet med de specifika servrarna eller om f\u00f6rdelningen av data \u00f6ver lagringsenheterna.<\/p>\n<h3>Ny procedur f\u00f6r byten<\/h3>\n<p>\nDet f\u00f6rsta vi gjorde var att separera alla diskincidenter till en egen typ \"HW-disk\" och l\u00e4gga till f\u00e4lten \"namn p\u00e5 blockenhet\", \"storlek\" och \"disktyp\" s\u00e5 att denna information sparades i biljetten och man inte beh\u00f6vde st\u00e4ndigt utbyta den i chatt. <\/p>\n<p><img decoding=\"async\" alt=\"Automatisering av diskbyten med hj\u00e4lp av Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/c4526bf668e31d90e0fbd061de44f1a7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVi kom ocks\u00e5 \u00f6verens om att vi inom ett och samma incident skulle byta endast en disk. Detta f\u00f6renklade avsev\u00e4rt processen f\u00f6r automatisering, insamling av statistik och arbete i framtiden. <\/p>\n<p>Dessutom lade vi till f\u00e4ltet \"ansvarig administrat\u00f6r\". Dit s\u00e4tts den jourhavande systemadministrat\u00f6ren automatiskt. Det \u00e4r mycket praktiskt, eftersom ingenj\u00f6ren nu alltid ser vem som \u00e4r ansvarig. Det beh\u00f6vs inte g\u00e5 till kalendern och leta. Just detta f\u00e4lt har gjort det m\u00f6jligt att visa biljetter p\u00e5 administrat\u00f6rens instrumentpanel d\u00e4r hans hj\u00e4lp kan beh\u00f6vas.<\/p>\n<p><img decoding=\"async\" alt=\"Automatisering av diskbyten med hj\u00e4lp av Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/5097e5dcca1fddd68d1e5f296c09f60a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nF\u00f6r att alla deltagare ska dra maximal nytta av nyheterna har vi skapat filter och instrumentpaneler och ber\u00e4ttat om dem f\u00f6r teamet. N\u00e4r folk f\u00f6rst\u00e5r f\u00f6r\u00e4ndringarna distanserar de sig inte fr\u00e5n dem som n\u00e5got on\u00f6digt. Ingenj\u00f6ren beh\u00f6ver veta racknumret d\u00e4r servern \u00e4r placerad, storlek och typ p\u00e5 disken. F\u00f6r administrat\u00f6ren \u00e4r det viktigt att f\u00f6rst och fr\u00e4mst f\u00f6rst\u00e5 vilken grupp servrar det handlar om och vilken effekt som kan uppn\u00e5s vid diskbyte.<\/p>\n<p>Att ha f\u00e4lt och deras visning \u00e4r praktiskt, men det l\u00f6ste inte behovet av att anv\u00e4nda chattar. F\u00f6r detta var vi tvungna att f\u00f6r\u00e4ndra arbetsprocessen. <\/p>\n<p>Tidigare var det s\u00e5 h\u00e4r:<\/p>\n<p><img decoding=\"async\" alt=\"Automatisering av diskbyten med hj\u00e4lp av Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/2b79cdb7ec88b5ae3d2917ad8b164c6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nI dag forts\u00e4tter ingenj\u00f6rerna att arbeta s\u00e5 h\u00e4r n\u00e4r de inte beh\u00f6ver hj\u00e4lp av administrat\u00f6ren.<\/p>\n<p>Det f\u00f6rsta vi gjorde var att inf\u00f6ra en ny status <b>Investigate<\/b>. I den h\u00e4r statusen befinner sig \u00e4rendet n\u00e4r ingenj\u00f6ren \u00e4nnu inte har best\u00e4mt sig f\u00f6r om han beh\u00f6ver hj\u00e4lp fr\u00e5n administrat\u00f6ren eller inte. Genom denna status kan ingenj\u00f6ren \u00f6verf\u00f6ra \u00e4rendet till administrat\u00f6ren. Dessutom markerar vi \u00e4renden med denna status n\u00e4r vi beh\u00f6ver byta disk, men sj\u00e4lva disken inte finns p\u00e5 plats. S\u00e5dant sker vid CDN och avl\u00e4gsna platser.<\/p>\n<p>Vi har ocks\u00e5 lagt till statusen <b>Redo<\/b>. \u00c4rendet \u00f6verg\u00e5r till denna status efter diskbytet. Det vill s\u00e4ga, allt \u00e4r redan gjort, men HW\/SW RAID synkroniseras p\u00e5 servern. Detta kan ta ganska l\u00e5ng tid.<\/p>\n<p>Om en administrat\u00f6r involveras i arbetet blir schemat lite mer komplicerat.<\/p>\n<p><img decoding=\"async\" alt=\"Automatisering av diskbyten med hj\u00e4lp av Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/5b6aacbb0d4049e62e7cb9ee28eb6498.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nFr\u00e5n statusen <b>\u00d6ppen<\/b> kan \u00e4rendet \u00f6verf\u00f6ras b\u00e5de av systemadministrat\u00f6ren och ingenj\u00f6ren. I statusen <b>In progress<\/b> tar administrat\u00f6ren ur disken fr\u00e5n rotation s\u00e5 att ingenj\u00f6ren enkelt kan ta ut den: han aktiverar belysningen, avmonterar disken, stoppar applikationer beroende p\u00e5 den specifika servergruppen.<\/p>\n<p>Sedan \u00f6verg\u00e5r \u00e4rendet till <b>Ready to change<\/b>: detta \u00e4r en signal till ingenj\u00f6ren att disken kan tas bort. Alla f\u00e4lt i Jira \u00e4r redan ifyllda, ingenj\u00f6ren vet vilken typ och storlek p\u00e5 disken. Dessa uppgifter fylls antingen i automatiskt i den f\u00f6reg\u00e5ende statusen eller av administrat\u00f6ren.<\/p>\n<p>Efter diskbytet \u00f6verg\u00e5r \u00e4rendet till statusen <b>Changed<\/b>. Det kontrolleras att r\u00e4tt disk sattes in, partitioneringen g\u00f6rs, applikationen startas och vissa uppgifter f\u00f6r datag \u00e5terst\u00e4llning utf\u00f6rs. \u00c4rendet kan ocks\u00e5 \u00f6verg\u00e5 till statusen <b>Redo<\/b>, i detta fall f\u00f6rblir administrat\u00f6ren ansvarig, eftersom han inf\u00f6rde disken i rotation. Det fullst\u00e4ndiga schemat ser ut s\u00e5 h\u00e4r.<\/p>\n<p><img decoding=\"async\" alt=\"Automatisering av diskbyten med hj\u00e4lp av Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/32f8d488e2ff6a28a3341114b66de0a3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTillkomsten av nya f\u00e4lt har avsev\u00e4rt underl\u00e4ttat v\u00e5rt arbete. Teamet har b\u00f6rjat arbeta med strukturerad information, vilket har gjort det tydligt vad som beh\u00f6ver g\u00f6ras och i vilket steg. Prioriteringarna har blivit mycket mer relevanta, eftersom de nu st\u00e4lls in av administrat\u00f6ren.<\/p>\n<p>Behovet av chattar har f\u00f6rsvunnit. Sj\u00e4lvklart kan administrat\u00f6ren skriva till ingenj\u00f6ren \"det h\u00e4r m\u00e5ste bytas snabbare\", eller \"det \u00e4r redan kv\u00e4ll, hinner du byta?\". Men vi kommunicerar inte l\u00e4ngre dagligen i chattarna om dessa fr\u00e5gor.<\/p>\n<p>Diskarna byts nu i grupper. Om administrat\u00f6ren kommer till arbetet lite tidigare och har lite ledig tid, samt inget har fungerat fel, kan han f\u00f6rbereda flera servrar f\u00f6r byte: s\u00e4tta in f\u00e4lt, ta bort diskar fr\u00e5n rotation och \u00f6verl\u00e4mna uppgiften till ingenj\u00f6ren. Ingenj\u00f6ren kommer lite senare till datacentret, ser uppgiften, tar de n\u00f6dv\u00e4ndiga lagringsenheterna fr\u00e5n lagret och byter dem omedelbart. Som ett resultat har hastigheten p\u00e5 bytena \u00f6kat.<\/p>\n<h3>Erfarenheterna fr\u00e5n att bygga arbetsfl\u00f6det<\/h3>\n<p><\/p>\n<ul>\n<li><b>Vid utformningen av proceduren \u00e4r det n\u00f6dv\u00e4ndigt att samla information fr\u00e5n olika k\u00e4llor.<\/b><br \/>\nVissa av v\u00e5ra administrat\u00f6rer visste inte att ingenj\u00f6ren bytte diskar sj\u00e4lvst\u00e4ndigt. N\u00e5gra trodde att ingenj\u00f6rerna \u00f6vervakade synkroniseringen av MD RAID, \u00e4ven om vissa av dem inte ens hade tillg\u00e5ng till det. N\u00e5gra av de ledande ingenj\u00f6rerna gjorde det, men inte alltid, eftersom processen inte var dokumenterad n\u00e5gonstans.<\/li>\n<li><b>Proceduren m\u00e5ste vara enkel och tydlig.<\/b><br \/>\nDet \u00e4r sv\u00e5rt f\u00f6r en person att h\u00e5lla m\u00e5nga steg i huvudet. De viktigaste angr\u00e4nsande statusarna i Jira m\u00e5ste lyftas upp p\u00e5 huvudsk\u00e4rmen. Vi kan till exempel kalla \"I progress\" f\u00f6r \"Redo att byta\". Andra statusar kan d\u00f6ljas i en rullgardinsmeny s\u00e5 att de inte st\u00f6r. Men det \u00e4r b\u00e4ttre att inte begr\u00e4nsa m\u00e4nniskor, ge dem m\u00f6jlighet till \u00f6verg\u00e5ng.<br \/>\nF\u00f6rklara v\u00e4rdet av nyheterna. N\u00e4r m\u00e4nniskor f\u00f6rst\u00e5r dem, accepterar de den nya proceduren b\u00e4ttre. Det var mycket viktigt f\u00f6r oss att folk inte bara klickade sig igenom hela processen, utan gick igenom den. Sedan byggde vi automatisering p\u00e5 detta.<\/li>\n<li><b>V\u00e4nta, analysera, f\u00f6rst\u00e5.<\/b><br \/>\nVi spenderade cirka en m\u00e5nad p\u00e5 att bygga processen, teknisk implementation, m\u00f6ten och diskussioner. Implementeringen tog mer \u00e4n tre m\u00e5nader. Jag har sett hur folk sakta b\u00f6rjar anv\u00e4nda den nya funktionen. I de f\u00f6rsta skedena var det mycket negativitet. Men det hade inget att g\u00f6ra med sj\u00e4lva processen eller dess tekniska implementation. Till exempel anv\u00e4nde en administrat\u00f6r inte Jira, utan ett Jira-plugin i Confluence, och vissa saker var honom otillg\u00e4ngliga. N\u00e4r vi visade honom Jira, \u00f6kade hans produktivitet b\u00e5de n\u00e4r det g\u00e4llde gemensamma uppgifter och diskbyten.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Automatisering av diskbyten<\/h2>\n<p>\nVi har f\u00f6rs\u00f6kt att automatisera diskbyten flera g\u00e5nger. Vi hade redan arbetat fram skript, men de gick antingen i interaktivt eller manuellt l\u00e4ge och kr\u00e4vde att de startades. Endast efter implementeringen av den nya processen f\u00f6rstod vi att det var just det vi saknade.<\/p>\n<p>Eftersom processen f\u00f6r byte nu \u00e4r uppdelad i steg, d\u00e4r varje steg har en specifik utf\u00f6rare och en lista med \u00e5tg\u00e4rder, kan vi inf\u00f6ra automatisering stegvis, ist\u00e4llet f\u00f6r att g\u00f6ra det helt p\u00e5 en g\u00e5ng. Till exempel kan det enklaste steget - Ready (kontroll av RAID\/data-synkronisering) enkelt delegeras till en bot. N\u00e4r boten l\u00e4rt sig lite kan den f\u00e5 en mer ansvarsfull uppgift - att f\u00f6ra in disken i rotation, etc.<\/p>\n<h3>Zoologisk tr\u00e4dg\u00e5rd av installationer<\/h3>\n<p>\nInnan vi pratar om boten, l\u00e5t oss g\u00f6ra en liten \u00f6versikt \u00f6ver v\u00e5r zoologiska tr\u00e4dg\u00e5rd av installationer. F\u00f6rst och fr\u00e4mst beror det p\u00e5 den enorma storleken av v\u00e5r infrastruktur. F\u00f6r det andra f\u00f6rs\u00f6ker vi anpassa den mest optimala h\u00e5rdvarukonfigurationen f\u00f6r varje tj\u00e4nst. Vi har cirka 20 olika modeller av h\u00e5rdvaru-RAID, fr\u00e4mst LSI och Adaptec, men vi har \u00e4ven HP och DELL i olika versioner. Varje RAID-controller har sin egen hanteringsverktyg. Kommandosatser och deras utdata kan variera fr\u00e5n version till version f\u00f6r varje RAID-controller. D\u00e4r HW-RAID inte anv\u00e4nds kan det finnas mdraid.<\/p>\n<p>N\u00e4stan alla v\u00e5ra nya installationer g\u00f6r vi utan diskreservning. Vi f\u00f6rs\u00f6ker att inte l\u00e4ngre anv\u00e4nda h\u00e5rdvara och mjukvara RAID, eftersom vi s\u00e4kerhetskopierar v\u00e5ra system p\u00e5 datacenter-niv\u00e5, och inte serverniv\u00e5. Men det finns sj\u00e4lvklart m\u00e5nga legacy-servrar som m\u00e5ste st\u00f6djas.<\/p>\n<p>N\u00e5gonstans dirigeras diskar i RAID-kontroller raw-enheter, n\u00e5gonstans anv\u00e4nds JBOD. Det finns konfigurationer med en systemdisk i servern, och om den beh\u00f6ver bytas ut m\u00e5ste servern rullas om med installation av operativsystem och applikationer, dessutom med samma versioner, f\u00f6r att sedan l\u00e4gga till konfigurationsfiler och starta applikationerna. Det finns ocks\u00e5 m\u00e5nga grupper av servrar d\u00e4r redundans sker inte p\u00e5 niv\u00e5n av lagringssystemet, utan direkt i applikationerna sj\u00e4lva.<\/p>\n<p>Totalt har vi mer \u00e4n 400 unika grupper av servrar som k\u00f6r omkring 100 olika applikationer. F\u00f6r att t\u00e4cka ett s\u00e5 enormt antal alternativ beh\u00f6vde vi ett multifunktionellt automatiseringsverktyg. Helst med ett enkelt DSL, s\u00e5 att vem som helst, inte bara den som skrev det, kan underh\u00e5lla det.<\/p>\n<p>Vi valde Ansible eftersom det \u00e4r agentfritt: ingen f\u00f6rberedelse av infrastruktur beh\u00f6vdes, och det var enkelt att komma ig\u00e5ng. Dessutom \u00e4r det skrivet i Python, som \u00e4r standard i teamet.<\/p>\n<h3>\u00d6versiktsdiagram<\/h3>\n<p>\nL\u00e5t oss titta p\u00e5 \u00f6versiktsdiagrammet f\u00f6r automatisering med hj\u00e4lp av ett exempel p\u00e5 en incident. Zabbix detekterar att disken sdb har kraschat, en trigger t\u00e4nds, och en ticket skapas i Jira. Administrat\u00f6ren tittar p\u00e5 den, inser att det inte \u00e4r en duplikat och inte en falsk positiv, vilket inneb\u00e4r att disken m\u00e5ste bytas ut, och han \u00f6verf\u00f6r ticketen till In progress.<\/p>\n<p><img decoding=\"async\" alt=\"Automatisering av diskbyten med hj\u00e4lp av Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/673df0fe9600bc65633841222f436d37.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nApplikationen DiskoBot, skriven i Python, kontrollerar regelbundet Jira efter nya tickets. Den m\u00e4rker att det har dykt upp en ny ticket i In progress, vilket aktiverar den motsvarande tr\u00e5den som startar playbook i Ansible (detta g\u00f6rs f\u00f6r varje status i Jira). I det h\u00e4r fallet startas Prepare2change.<\/p>\n<p>Ansible skickas till v\u00e4rden, plockar bort disken fr\u00e5n rotation och rapporterar statusen till applikationen via Callbacks. <\/p>\n<p><img decoding=\"async\" alt=\"Automatisering av diskbyten med hj\u00e4lp av Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/8bfc13129f8deca640eb63ea81f616c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nBaserat p\u00e5 resultatet \u00f6verf\u00f6r boten automatiskt ticketen till Ready to change. Ingenj\u00f6ren f\u00e5r en avisering och g\u00e5r f\u00f6r att byta disken, varefter han f\u00f6r \u00f6ver ticketen till Changed. <\/p>\n<p><img decoding=\"async\" alt=\"Automatisering av diskbyten med hj\u00e4lp av Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/eeda06b6966f435e2172d3f9c61b341e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEnligt den ovanbeskrivna schemat \u00e5terg\u00e5r ticketen till boten, som startar en annan playbook, g\u00e5r till v\u00e4rden och s\u00e4tter in disken i rotation. Boten st\u00e4nger ticketen. Hurra!<\/p>\n<p><img decoding=\"async\" alt=\"Automatisering av diskbyten med hj\u00e4lp av Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/51b8c7050b0c10c16ad6a6d4974c3ebf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNu pratar vi om n\u00e5gra komponenter i systemet.<\/p>\n<h3>Diskobot<\/h3>\n<p>\nDenna applikation \u00e4r skriven i Python. Den v\u00e4ljer tickets fr\u00e5n Jira enligt JQL. Beroende p\u00e5 ticketens status kommer den sistn\u00e4mnda att g\u00e5 till den motsvarande hanteraren, som i sin tur startar den Ansible playbook som motsvarar statusen.<\/p>\n<p>JQL och unders\u00f6kningsintervall definieras i applikationens konfigurationsfil.<\/p>\n<pre><code class=\"plaintext\">jira_states:\n  investigate:\n    jql: '\u2026 status = Open and \"Disk Size\" is EMPTY'\n    interval: 180\n\n  inprogress:\n    jql: '\u2026  and \"Disk Size\" is not EMPTY and \"Device Name\" is not EMPTY'\n \n  ready:\n    jql: '\u2026 and (labels not in (\"dbot_ignore\") or labels is EMPTY)'\n    interval: 7200\n<\/code><\/pre>\n<p>\nTill exempel, bland biljetter i statusen In progress, v\u00e4ljs endast de som har f\u00e4lten Disk size och Device name ifyllda. Device name \u00e4r namnet p\u00e5 blockenheten som beh\u00f6vs f\u00f6r att k\u00f6ra playbook\u2019en. Disk size beh\u00f6vs f\u00f6r att ingenj\u00f6ren ska veta vilken storlek p\u00e5 disken som kr\u00e4vs.<\/p>\n<p>Bland biljetter med statusen Ready filtreras biljetter med etiketten dbot_ignore. F\u00f6r \u00f6vrigt anv\u00e4nder vi Jira-etiketter b\u00e5de f\u00f6r s\u00e5dan filtrering och f\u00f6r att m\u00e4rka dubbletter av biljetter, samt f\u00f6r att samla statistik.<\/p>\n<p>Vid ett fel i playbook\u2019en tilldelar Jira etiketten dbot_failed s\u00e5 att det senare g\u00e5r att reda ut. <\/p>\n<h3>Interaktion med Ansible<\/h3>\n<p>\nApplikationen interagerar med Ansible via <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/dev_guide\/developing_api.html\">Ansible Python API<\/a><\/noindex>. I playbook_executor skickar vi filnamnet och en upps\u00e4ttning variabler. Detta g\u00f6r att vi kan h\u00e5lla Ansible-projektet i form av vanliga yml-filer, ist\u00e4llet f\u00f6r att beskriva det i Python-kod. <\/p>\n<p>Dessutom \u00f6verf\u00f6rs namn p\u00e5 blockenheten, status f\u00f6r biljetten och callback_url via *extra_vars*, d\u00e4r fr\u00e5ga nyckeln \u00e4r inb\u00e4ddad \u2014 den anv\u00e4nds f\u00f6r callback i HTTP.<\/p>\n<p>F\u00f6r varje k\u00f6rning genereras en tillf\u00e4llig inventory som best\u00e5r av en v\u00e4rd och en grupp som denna v\u00e4rd ing\u00e5r i, s\u00e5 att group_vars till\u00e4mpas.<\/p>\n<p>H\u00e4r \u00e4r ett exempel p\u00e5 en uppgift som implementerar HTTP callback.<\/p>\n<p>Resultatet av playbook-k\u00f6rningar f\u00e5r vi genom callback(s). De finns i tv\u00e5 typer:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/plugins\/callback.html\">Ansible callback-plugin<\/a><\/noindex>, den tillhandah\u00e5ller data om resultaten av playbook-k\u00f6rningen. D\u00e4r beskrivs uppgifter som har startats, som har genomf\u00f6rts framg\u00e5ngsrikt eller misslyckats. Denna callback anropas vid slutet av k\u00f6rningen av playbook\u2019en.<\/li>\n<li>HTTP callback f\u00f6r att f\u00e5 information under k\u00f6rningen av playbook\u2019en. I Ansible-uppgiften g\u00f6r vi en POST\/GET-f\u00f6rfr\u00e5gan till v\u00e5r applikation.<\/li>\n<\/ul>\n<p>\nGenom HTTP callback(s) \u00f6verf\u00f6rs variabler som har definierats vid k\u00f6rningen av playbook\u2019en och som vi vill spara och anv\u00e4nda i kommande k\u00f6rningar. Dessa data skriver vi till sqlite.<\/p>\n<p>\u00c4ven genom HTTP callback l\u00e4mnar vi kommentarer och \u00e4ndrar statusen f\u00f6r biljetten.<\/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>Som m\u00e5nga liknande uppgifter har vi flyttat det till en separat gemensam fil och inkluderar det vid behov f\u00f6r att inte st\u00e4ndigt upprepa det i playbooks. H\u00e4r n\u00e4mns callback_url, d\u00e4r issue key och host name \u00e4r inb\u00e4ddade. N\u00e4r Ansible utf\u00f6r denna POST-beg\u00e4ran f\u00f6rst\u00e5r boten att den kom inom ramen f\u00f6r en viss incident.<\/p>\n<p>H\u00e4r \u00e4r ett exempel fr\u00e5n playbooken d\u00e4r vi tog bort en disk fr\u00e5n MD-enheten:<\/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>\nDenna uppgift \u00e4ndrar Jira-biljetten till status \"Ready to change\" och l\u00e4gger till en kommentar. Dessutom sparas listan \u00f6ver md-enheter fr\u00e5n vilka disken har tagits bort i variabeln mdam_data, och partitionens dump fr\u00e5n parted sparas i parted_info. <\/p>\n<p>N\u00e4r ingenj\u00f6ren s\u00e4tter in en ny disk kan vi anv\u00e4nda dessa variabler f\u00f6r att \u00e5terst\u00e4lla partitionens dump och registrera disken i de md-enheter d\u00e4r den togs bort.<\/p>\n<h3>Ansible check-l\u00e4ge<\/h3>\n<p>\nDet var skr\u00e4mmande att aktivera automatiseringen. D\u00e4rf\u00f6r beslutade vi oss f\u00f6r att k\u00f6ra alla playbooks i l\u00e4get <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_checkmode.html\">dry run<\/a><\/noindex>, i vilket Ansible inte utf\u00f6r n\u00e5gra \u00e5tg\u00e4rder p\u00e5 servrarna, utan endast emulerar dem. <\/p>\n<p>Denna k\u00f6rning g\u00e5r genom en separat callback-modul, och resultatet av playbookens k\u00f6rning sparas i Jira som en kommentar.<\/p>\n<p><img decoding=\"async\" alt=\"Automatisering av diskbyten med hj\u00e4lp av Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/b02d7f1dc428f2797ae8556cd496b115.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nF\u00f6r det f\u00f6rsta gjorde detta att vi kunde validera botens och playbookarnas funktion. F\u00f6r det andra \u00f6kade det administrat\u00f6rernas f\u00f6rtroende f\u00f6r boten. <\/p>\n<p>N\u00e4r vi genomgick valideringen och ins\u00e5g att vi kan k\u00f6ra Ansible inte bara i dry run-l\u00e4get, skapade vi en knapp i Jira, Run Diskobot, f\u00f6r att k\u00f6ra samma playbook med samma variabler p\u00e5 samma v\u00e4rd, men i normalt l\u00e4ge. <\/p>\n<p>Dessutom anv\u00e4nds knappen f\u00f6r att k\u00f6ra om playbooken vid eventuell fel.<\/p>\n<h3>Strukturen f\u00f6r Playbooks<\/h3>\n<p>\nJag har redan n\u00e4mnt att beroende p\u00e5 statusen f\u00f6r Jira-biljetten, k\u00f6r boten olika playbooks.<\/p>\n<p>F\u00f6r det f\u00f6rsta \u00e4r det mycket enklare att organisera ing\u00e5ngen. <br \/>\nF\u00f6r det andra \u00e4r det i vissa fall helt enkelt n\u00f6dv\u00e4ndigt. <\/p>\n<p>Till exempel, vid byte av systemdisk m\u00e5ste man f\u00f6rst g\u00e5 till distributionssystemet, skapa en uppgift, och efter korrekt distribution blir servern tillg\u00e4nglig via ssh och man kan installera applikationen. Om vi hade gjort allt detta i en playbook skulle Ansible inte ha kunnat utf\u00f6ra den p\u00e5 grund av v\u00e4rdens otillg\u00e4nglighet.<\/p>\n<p>Vi anv\u00e4nder Ansible-roller f\u00f6r varje servergrupp. H\u00e4r kan man se hur playbooks \u00e4r organiserade i en av dem. <\/p>\n<p><img decoding=\"async\" alt=\"Automatisering av diskbyten med hj\u00e4lp av Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/7a14035392b33f01d3182d5fff779321.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDet \u00e4r bekv\u00e4mt eftersom det \u00e4r tydligt var olika uppgifter ligger. I main.yml, som \u00e4r ing\u00e5ngen f\u00f6r Ansible-rollen, kan vi ha en enkel include baserat p\u00e5 ticketstatus eller gemensamma uppgifter som beh\u00f6vs f\u00f6r alla, till exempel identifiering eller h\u00e4mta token.<\/p>\n<h4>Investigation.yml<\/h4>\n<p>\nK\u00f6rs f\u00f6r biljetter i statusen Investigation och Open. Det viktigaste f\u00f6r denna playbook \u00e4r namnet p\u00e5 blockenheten. Denna information \u00e4r inte alltid tillg\u00e4nglig. <\/p>\n<p>F\u00f6r att f\u00e5 denna information analyserar vi Jira-sammanfattningen, det senaste v\u00e4rdet fr\u00e5n Zabbix-trigger. D\u00e4r kan namnet p\u00e5 blockenheten finnas \u2014 om vi har tur. Annars kan det inneh\u00e5lla mount point, d\u00e5 m\u00e5ste vi g\u00e5 till servern, parsa och r\u00e4kna ut r\u00e4tt disk. Triggern kan ocks\u00e5 skicka scsi-adress eller annan information. Men ibland finns det inga ledtr\u00e5dar, och vi m\u00e5ste analysera.<\/p>\n<p>N\u00e4r vi har namnet p\u00e5 blockenheten samlar vi information om typ och storlek p\u00e5 disken f\u00f6r att fylla i f\u00e4lten i Jira. Vi f\u00e5r ocks\u00e5 information om tillverkaren, modell, firmware, ID, SMART, och allt detta l\u00e4ggs till kommentaren i Jira-ticket. Administrat\u00f6ren och ingenj\u00f6ren beh\u00f6ver nu inte leta efter dessa uppgifter. \ud83d\ude42<\/p>\n<p><img decoding=\"async\" alt=\"Automatisering av diskbyten med hj\u00e4lp av Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/259bf8712c013ee00d238f111b4280fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>prepare2change.yml<\/h4>\n<p>\nTa ut disken fr\u00e5n rotation, f\u00f6rbereda f\u00f6r byte. Det \u00e4r det sv\u00e5raste och mest ansvarsfulla steget. H\u00e4r kan man stanna applikationen n\u00e4r den inte kan stoppas. Eller ta ut en disk som hade brist p\u00e5 repliker, vilket p\u00e5verkar anv\u00e4ndarna och kan leda till dataf\u00f6rlust. H\u00e4r har vi flest kontroller och aviseringar i chatten.<\/p>\n<p>I det enklaste fallet handlar det om att ta bort disken fr\u00e5n HW\/MD RAID. <\/p>\n<p>I mer komplexa situationer (i v\u00e5ra lagringssystem), n\u00e4r redundans utf\u00f6rs p\u00e5 applikationsniv\u00e5, m\u00e5ste man g\u00e5 in i applikationen via API, rapportera om uttag av disken, inaktivera den och initiera \u00e5terst\u00e4llningen.<\/p>\n<p>Vi migrerar nu massivt till <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/odnoklassniki\/blog\/346868\">molnet<\/a><\/noindex>, och om servern \u00e4r molnbaserad, kontaktar Diskobot molnets API, s\u00e4ger att den t\u00e4nker arbeta med denna mini-server \u2014 servern d\u00e4r containrar k\u00f6rs \u2014 och ber \"migrera alla containrar fr\u00e5n denna mini-server\". Samtidigt sl\u00e5r den p\u00e5 diskens belysning s\u00e5 att ingenj\u00f6ren direkt kan se vilken som beh\u00f6ver tas bort.<\/p>\n<h4>changed.yml<\/h4>\n<p>\nEfter diskbytet kontrollerar vi f\u00f6rst dess tillg\u00e4nglighet. <\/p>\n<p>Ingenj\u00f6rer byter inte alltid ut diskar, s\u00e5 vi har lagt till en kontroll av de SMART-v\u00e4rden som vi \u00e4r n\u00f6jda med.<\/p>\n<p><b class=\"spoiler_title\">Vilka attribut tittar vi p\u00e5<\/b>Reallocated Sectors Count (5) &lt; 100<br \/>\nCurrent Pending Sector Count (107) == 0<\/p>\n<p>Om disken inte klarar kontrollen meddelas ingenj\u00f6ren om att den ska bytas ut igen. Om allt \u00e4r i ordning sl\u00e4cks belysningen, m\u00e4tningen appliceras och disken tas i rotation.<\/p>\n<h4>ready.yml<\/h4>\n<p>\nDet enklaste fallet: kontroll av synkronisering av HW\/SW raid eller avslutning av datasykronisering i applikationen.<\/p>\n<h3>Applikations-API<\/h3>\n<p>\nJag har n\u00e4mnt flera g\u00e5nger att boten ofta kontaktar applikations-API:et. Sj\u00e4lvklart hade inte alla applikationer de n\u00f6dv\u00e4ndiga metoderna, s\u00e5 vi var tvungna att revidera dem. H\u00e4r \u00e4r de viktigaste metoderna som vi anv\u00e4nder:<\/p>\n<ul>\n<li>Status. Status f\u00f6r klustret eller disken f\u00f6r att f\u00f6rst\u00e5 om det g\u00e5r att arbeta med det;\n<\/li>\n<li>Start\/stop. Aktivering och deaktivering av disken;\n<\/li>\n<li>Migrate\/restore. Migrering och \u00e5terst\u00e4llande av data under och efter bytet.\n<\/li>\n<\/ul>\n<p><\/p>\n<h3>Erfarenhet fr\u00e5n Ansible<\/h3>\n<p>\nJag \u00e4lskar Ansible v\u00e4ldigt mycket. Men ofta, n\u00e4r jag ser p\u00e5 olika opensource-projekt och ser hur folk skriver playbooks, blir jag lite skr\u00e4md. Komplexa logiska sammanfl\u00e4tningar av when\/loop, brist p\u00e5 flexibilitet och idempotens p\u00e5 grund av frekvent anv\u00e4ndning av shell\/command.<\/p>\n<p>Vi har valt att f\u00f6renkla allt s\u00e5 mycket som m\u00f6jligt genom att dra nytta av Ansibles modul\u00e4r struktur. P\u00e5 h\u00f6gsta niv\u00e5 finns playbooks, som kan skrivas av vilken administrat\u00f6r som helst, extern utvecklare som har lite kunskap om Ansible.<\/p>\n<pre><code class=\"plaintext\">- name: Blink disk\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>Om n\u00e5gon logik \u00e4r sv\u00e5r att implementera i playbooks, tar vi ut den i en Ansible-modul eller filter. Skripten kan skrivas antingen i Python eller vilket annat spr\u00e5k som helst. <\/p>\n<p>De \u00e4r l\u00e4tta och snabba att skriva. Till exempel best\u00e5r modulen f\u00f6r att blinka disken, vars anv\u00e4ndning beskrivs ovan, av 265 rader.<\/p>\n<p><img decoding=\"async\" alt=\"Automatisering av diskbyten med hj\u00e4lp av Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/08e0384bfad24f3ee61e0643ca087852.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u00e5 den l\u00e4gsta niv\u00e5n finns biblioteket. F\u00f6r detta projekt skrev vi en separat applikation, en slags abstraktion \u00f6ver h\u00e5rdvaru- och mjukvaru-RAID som utf\u00f6r motsvarande f\u00f6rfr\u00e5gningar. <\/p>\n<p><img decoding=\"async\" alt=\"Automatisering av diskbyten med hj\u00e4lp av Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/0edda3182026ce6279bd84c99613e3d6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAnsibles starkaste sidor \u00e4r dess enkelhet och tydliga playbooks. Jag anser att vi b\u00f6r utnyttja detta och inte generera skr\u00e4mmande yaml-filer och en m\u00e4ngd villkor, shell-kod och loopar.<\/p>\n<p>Om du vill upprepa v\u00e5r erfarenhet med Ansible API, ha tv\u00e5 saker i \u00e5tanke:<\/p>\n<ul>\n<li>Playbook_executor och playbook kan \u00f6verhuvudtaget inte ges en timeout. Det finns en timeout f\u00f6r ssh-sessioner, men ingen timeout f\u00f6r playbook. Om vi f\u00f6rs\u00f6ker avmontera en disk som inte l\u00e4ngre finns i systemet, kommer playbook att k\u00f6ras o\u00e4ndligt, s\u00e5 vi var tvungna att sl\u00e5 in dess k\u00f6rning i ett eget wrapper och d\u00f6da den efter timeout.\n<\/li>\n<li>Ansible \u00e4r baserat p\u00e5 fork-processer, s\u00e5 dess API \u00e4r inte tr\u00e5ds\u00e4kert. Vi k\u00f6r alla v\u00e5ra playbooks entr\u00e5digt.\n<\/li>\n<\/ul>\n<p>\nSom ett resultat har vi lyckats automatisera bytet av cirka 80 % av diskarna. Generellt har hastigheten f\u00f6r bytena f\u00f6rdubblats. Idag tittar administrat\u00f6ren bara p\u00e5 incidenten och beslutar om disken beh\u00f6ver bytas eller inte, och g\u00f6r sedan ett enda klick.<\/p>\n<p>Men nu b\u00f6rjar vi st\u00e4llas inf\u00f6r ett annat problem: vissa nya administrat\u00f6rer vet inte hur man byter diskar. \ud83d\ude42<br \/>\n<br \/>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Automatisering av diskbyte med Ansible | ProHoster","description":"Hej alla.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/34841","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=34841"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/34841\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/26233"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=34841"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=34841"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=34841"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}