{"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\/ro\/blog\/administrirovanie\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible","title":{"rendered":"Automatizarea \u00eenlocuirii discurilor cu ajutorul Ansible","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Automatizarea \u00eenlocuirii discurilor cu ajutorul Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/c60a2326ab13e7766eafda3ae5ac39c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nBun\u0103 ziua tuturor. Lucrez ca administrator de sistem principal la OK \u0219i sunt responsabil pentru func\u021bionarea stabil\u0103 a portalului. Vreau s\u0103 v\u0103 povestesc despre cum am construit procesul de \u00eenlocuire automat\u0103 a discurilor \u0219i apoi, cum am exclus administratorul din acest proces \u0219i l-am \u00eenlocuit cu un bot.<\/p>\n<p>Acest articol este o oarecare transliterare <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=5WhbG3FQveE&amp;list=FLKN7KW1sxju7fWJvKuyKxEQ\">a discursului<\/a><\/noindex> de la HighLoad+ 2018<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Construirea procesului de \u00eenlocuire a discurilor<\/h2>\n<p><\/p>\n<h3>Mai \u00eent\u00e2i c\u00e2teva cifre<\/h3>\n<p>\nOK este un serviciu uria\u0219, utilizat de milioane de oameni. Este \u00eentre\u021binut de aproximativ 7.000 de servere, situate \u00een 4 centre de date diferite. \u00cen servere sunt installate peste 70.000 de discuri. Dac\u0103 le a\u0219ez\u0103m unele peste altele, ob\u021binem un turn de peste 1 km \u00een\u0103l\u021bime. <\/p>\n<p>Discurile dure sunt componenta serverului care se defecteaz\u0103 cel mai des. La un astfel de volum, suntem nevoi\u021bi s\u0103 schimb\u0103m aproximativ 30 de discuri pe s\u0103pt\u0103m\u00e2n\u0103, iar aceast\u0103 procedur\u0103 a devenit o rutin\u0103 nu foarte pl\u0103cut\u0103.<\/p>\n<p><img decoding=\"async\" alt=\"Automatizarea \u00eenlocuirii discurilor cu ajutorul Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/5e915e9077994efcc4e74a26fc6286fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Incidente<\/h3>\n<p>\n\u00cen compania noastr\u0103, avem un management complet al incidentelor. Fiecare incident este \u00eenregistrat \u00een Jira, iar apoi este rezolvat \u0219i analizat. Dac\u0103 incidentul a avut efecte asupra utilizatorilor, ne \u00eent\u00e2lnim neap\u0103rat \u0219i discut\u0103m despre cum s\u0103 reac\u021bion\u0103m mai rapid \u00een astfel de cazuri, cum s\u0103 reducem impactul \u0219i, desigur, cum s\u0103 prevenim repetarea.<\/p>\n<p>Stoc\u0103rile nu fac excep\u021bie. Starea acestora este monitorizat\u0103 de Zabbix. Monitoriz\u0103m mesajele \u00een Syslog pentru erori de scriere\/lectur\u0103, analiz\u0103m starea RAID-urilor HW\/SW, urm\u0103rim SMART-ul, iar pentru SSD-uri calcul\u0103m uzura. <\/p>\n<h3>Cum se schimbau discurile \u00eenainte<\/h3>\n<p>\nC\u00e2nd un trigger se aprinde \u00een Zabbix, un incident este creat \u00een Jira \u0219i este atribuit automat inginerilor corespunz\u0103tori din centrele de date. Facem acest lucru pentru toate incidentele HW, adic\u0103 cele care necesit\u0103 o munc\u0103 fizic\u0103 cu echipamentul din centrul de date. <br \/>\nInginerul din centrul de date este persoana care se ocup\u0103 de problemele legate de hardware, r\u0103spunz\u00e2nd de instalarea, \u00eentre\u021binerea \u0219i demontarea serverelor. Dup\u0103 ce prime\u0219te un tichet, inginerul \u00eencepe lucrul. \u00cen rack-urile cu discuri, el schimb\u0103 discurile singur. Dar dac\u0103 nu are acces la dispozitivul necesar, inginerul se adreseaz\u0103 administratorilor de sistem de gard\u0103 pentru ajutor. \u00cen primul r\u00e2nd, trebuie s\u0103 scoat\u0103 discul din rota\u021bie. Pentru aceasta, trebuie s\u0103 fac\u0103 modific\u0103rile necesare pe server, s\u0103 opreasc\u0103 aplica\u021biile \u0219i s\u0103 de-monteze discul.<\/p>\n<p>Administratorul de sistem de gard\u0103 este responsabil pe parcursul turei de munc\u0103 pentru func\u021bionarea \u00eentregului portal. Acesta investigheaz\u0103 incidentele, se ocup\u0103 de repara\u021bii, ajut\u0103 dezvoltatorii s\u0103 \u00eendeplineasc\u0103 sarcini minore. Nu se ocup\u0103 \u00eens\u0103 de hard disk-uri.<\/p>\n<p>Anterior, inginerii din data center comunicau cu administratorul de sistem prin chat. Ace\u0219tia trimiteau linkuri la tichetele Jira, iar administratorul le verifica, \u021binea un jurnal al activit\u0103\u021bilor \u00eentr-un fel de caiet. \u00cens\u0103 pentru astfel de sarcini, chat-ul era incomod: informa\u021biile nu erau structurate \u0219i se pierdeau rapid. \u00cen plus, administratorul putea s\u0103 se abat\u0103 de la calculator, r\u0103m\u00e2n\u00e2nd o perioad\u0103 f\u0103r\u0103 a r\u0103spunde la cereri, iar inginerul st\u0103tea l\u00e2ng\u0103 server cu un pachet de discuri \u0219i a\u0219tepta.<\/p>\n<p>Dar cel mai r\u0103u era c\u0103 administratorii nu vedeau imaginea de ansamblu: ce incidente legate de discuri exist\u0103, unde ar putea ap\u0103rea o problem\u0103. Acest lucru se datoreaz\u0103 faptului c\u0103 toate incidentele HW erau \u00eencredin\u021bate inginerilor. Da, ar fi putut fi afi\u0219ate toate incidentele pe tabloul de bord al administratorului. \u00cens\u0103 acestea erau foarte multe, iar administratorul era implicat doar \u00een unele dintre ele.<\/p>\n<p>\u00cen plus, inginerul nu putea stabili corect priorit\u0103\u021bile pentru c\u0103 nu \u0219tia nimic despre destina\u021bia serverelor specifice, despre distribu\u021bia informa\u021biilor pe unit\u0103\u021bile de stocare.<\/p>\n<h3>Noua procedur\u0103 de \u00eenlocuire<\/h3>\n<p>\nPrimul lucru pe care l-am f\u0103cut a fost s\u0103 scoatem toate incidentele legate de discuri \u00eentr-un tip separat \"HW-disk\" \u0219i s\u0103 ad\u0103ug\u0103m c\u00e2mpurile \"numele dispozitivului de bloc\", \"dimensiune\" \u0219i \"tip de disc\", astfel \u00eenc\u00e2t aceste informa\u021bii s\u0103 fie p\u0103strate \u00een tichet \u0219i s\u0103 nu mai fie necesar s\u0103 facem schimburi constante pe chat. <\/p>\n<p><img decoding=\"async\" alt=\"Automatizarea \u00eenlocuirii discurilor cu ajutorul Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/c4526bf668e31d90e0fbd061de44f1a7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDe asemenea, am convenit c\u0103 \u00een cadrul unui singur incident vom schimba doar un singur disc. Acest lucru a simplificat considerabil procesul de automatizare ulterior, colectarea statisticilor \u0219i activitatea. <\/p>\n<p>\u00cen plus, am ad\u0103ugat c\u00e2mpul \"administrator responsabil\". Acolo este introdus automat administratorul de sistem de gard\u0103. Acest lucru este foarte convenabil deoarece acum inginerul vede mereu cine este responsabil. Nu trebuie s\u0103 se uite \u00een calendar \u0219i s\u0103 caute. Exact acest c\u00e2mp a permis s\u0103 fie afi\u0219ate \u00een tabloul de bord al administratorului tichetele \u00een care, poate, va avea nevoie de ajutorul s\u0103u.<\/p>\n<p><img decoding=\"async\" alt=\"Automatizarea \u00eenlocuirii discurilor cu ajutorul Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/5097e5dcca1fddd68d1e5f296c09f60a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPentru ca to\u021bi participan\u021bii s\u0103 beneficieze la maxim de inova\u021bii, am creat filtre \u0219i tablouri de bord, pe care le-am explicat echipei. C\u00e2nd oamenii \u00een\u021beleg schimb\u0103rile, nu se distan\u021beaz\u0103 de ele, ca \u0219i cum ar fi ceva inutil. Inginerul trebuie s\u0103 \u0219tie num\u0103rul raftului unde se afl\u0103 serverul, dimensiunea \u0219i tipul discului. Administratorul trebuie, \u00een primul r\u00e2nd, s\u0103 \u00een\u021beleag\u0103 ce grup de servere este, care ar putea fi efectul \u00een cazul \u00eenlocuirii discului.<\/p>\n<p>Existenta c\u00e2mpurilor \u0219i modul \u00een care sunt afi\u0219ate este convenabil, dar acest lucru nu ne-a scutit de necesitatea de a folosi chat-uri. A fost necesar\u0103 modificarea fluxului de lucru pentru asta. <\/p>\n<p>\u00cen trecut, el era a\u0219a:<\/p>\n<p><img decoding=\"async\" alt=\"Automatizarea \u00eenlocuirii discurilor cu ajutorul Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/2b79cdb7ec88b5ae3d2917ad8b164c6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAst\u0103zi, inginerii continu\u0103 s\u0103 lucreze a\u0219a, c\u00e2nd nu au nevoie de ajutorul administratorului.<\/p>\n<p>Primul lucru pe care l-am f\u0103cut a fost s\u0103 introducem un nou statut <b>Investigate<\/b>. \u00cen acest statut, tichetul se afl\u0103 atunci c\u00e2nd inginerul nu a decis \u00eenc\u0103 dac\u0103 va avea nevoie de administrator sau nu. Prin acest statut, inginerul poate transfera tichetul c\u0103tre administrator. \u00cen plus, prin acest statut, marc\u0103m tichetele atunci c\u00e2nd este necesar\u0103 \u00eenlocuirea discului, dar discul nu se afl\u0103 pe platform\u0103. Acest lucru se poate \u00eent\u00e2mpla \u00een cazul CDN-urilor \u0219i platformelor externe.<\/p>\n<p>De asemenea, am ad\u0103ugat statutul <b>Gata<\/b>. \u00cen acest statut, tichetul este mutat dup\u0103 \u00eenlocuirea discului. Adic\u0103 totul este deja f\u0103cut, dar pe server se sincronizeaz\u0103 HW\/SW RAID. Acest lucru poate dura destul de mult timp.<\/p>\n<p>Dac\u0103 este implicat administratorul, schema devine pu\u021bin mai complicat\u0103.<\/p>\n<p><img decoding=\"async\" alt=\"Automatizarea \u00eenlocuirii discurilor cu ajutorul Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/5b6aacbb0d4049e62e7cb9ee28eb6498.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDin statutul <b>Open<\/b> , tichetul poate fi mutat at\u00e2t de administratorul de sistem, c\u00e2t \u0219i de inginer. \u00cen statutul <b>In progress<\/b> , administratorul scoate discul din rota\u021bie, astfel \u00eenc\u00e2t inginerul s\u0103-l poat\u0103 scoate cu u\u0219urin\u021b\u0103: activeaz\u0103 iluminarea, deconecteaz\u0103 discul, opre\u0219te aplica\u021biile, \u00een func\u021bie de grupul specific de servere.<\/p>\n<p>Apoi, tichetul este transferat \u00een <b>Ready to change<\/b>: acesta este un semnal pentru inginer c\u0103 discul poate fi scos. Toate c\u00e2mpurile din Jira sunt deja completate, inginerul \u0219tie ce tip \u0219i dimensiune are discul. Aceste date sunt completate fie automat \u00een statutul anterior, fie de c\u0103tre administrator.<\/p>\n<p>Dup\u0103 \u00eenlocuirea discului, tichetul este mutat \u00een statutul <b>Changed<\/b>. Se verific\u0103 dac\u0103 s-a introdus discul corespunz\u0103tor, se face cartografierea, se porne\u0219te aplica\u021bia \u0219i unele sarcini de recuperare a datelor. De asemenea, tichetul poate fi mutat \u00een statutul <b>Gata<\/b>, \u00een acest caz, responsabilul r\u0103m\u00e2ne administratorul, deoarece el a introdus discul \u00een rota\u021bie. Schema complet\u0103 arat\u0103 astfel.<\/p>\n<p><img decoding=\"async\" alt=\"Automatizarea \u00eenlocuirii discurilor cu ajutorul Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/32f8d488e2ff6a28a3341114b66de0a3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAd\u0103ugarea de c\u00e2mpuri noi ne-a u\u0219urat considerabil munca. Echipa a \u00eenceput s\u0103 lucreze cu informa\u021bii structurate, a devenit clar ce trebuie f\u0103cut \u0219i \u00een ce etap\u0103. Priorit\u0103\u021bile au devenit mult mai relevante, deoarece acum sunt stabilite de administrator.<\/p>\n<p>Nu mai este nevoie de chaturi. Desigur, administratorul poate scrie inginerului \u201eaici trebuie s\u0103 schimb\u0103m mai repede\u201d sau \u201esunt deja sear\u0103, reu\u0219e\u0219ti s\u0103 schimbi?\u201d. Dar nu mai comunic\u0103m zilnic \u00een chaturi despre aceste subiecte.<\/p>\n<p>Discurile au \u00eenceput s\u0103 fie schimbate \u00een loturi. Dac\u0103 administratorul ajunge la munc\u0103 pu\u021bin mai devreme, are timp liber, \u0219i nimic nu s-a \u00eent\u00e2mplat, poate preg\u0103ti mai multe servere pentru \u00eenlocuire: poate marca c\u00e2mpurile, scoate discurile din rota\u021bie \u0219i transmite sarcina inginerului. Inginerul vine pu\u021bin mai t\u00e2rziu la centrul de date, vede sarcina, ia din depozit unit\u0103\u021bile necesare \u0219i le schimb\u0103 imediat. Ca urmare, viteza de \u00eenlocuire a crescut.<\/p>\n<h3>Experien\u021ba acumulat\u0103 \u00een construirea fluxului de lucru<\/h3>\n<p><\/p>\n<ul>\n<li><b>\u00cen elaborarea procedurii, trebuie s\u0103 str\u00e2ngi informa\u021bii din diverse surse.<\/b><br \/>\nUnii dintre administratorii no\u0219tri nu \u0219tiau c\u0103 inginerul schimb\u0103 discurile de unul singur. Unii credeau c\u0103 inginerii monitorizeaz\u0103 sincronizarea MD RAID, de\u0219i unii dintre ei nu aveau acces pentru aceasta. Unii ingineri principali o f\u0103ceau, dar nu \u00eentotdeauna, deoarece procesul nu era nic\u0103ieri descris.<\/li>\n<li><b>Procedura trebuie s\u0103 fie simpl\u0103 \u0219i clar\u0103.<\/b><br \/>\nEste greu pentru o persoan\u0103 s\u0103 \u021bin\u0103 \u00een minte multe etape. Cele mai importante st\u0103ri adiacente \u00een Jira trebuie scoase pe ecranul principal. Le putem redenumi, de exemplu, In progress le numim Ready to change. Iar celelalte st\u0103ri pot fi ascunse \u00een meniul derulant, pentru a nu deranja. Dar este mai bine s\u0103 nu limit\u0103m oamenii, s\u0103 le oferim posibilitatea de a face tranzi\u021bia.<br \/>\nExplica\u021bi valoarea inova\u021biilor. C\u00e2nd oamenii \u00een\u021beleg, accept\u0103 mai bine noua procedur\u0103. A fost foarte important pentru noi ca oamenii s\u0103 nu parcurg\u0103 \u00eentregul proces pe ner\u0103suflate, ci s\u0103-l urmeze. Apoi am \u00eenceput s\u0103 construim automatiz\u0103ri pe baza acestuia.<\/li>\n<li><b>A\u0219teapt\u0103, analizeaz\u0103, \u00een\u021belege.<\/b><br \/>\nNe-a luat aproximativ o lun\u0103 s\u0103 construim procedura, realizarea tehnic\u0103, \u00eent\u00e2lnirile \u0219i discu\u021biile. Iar implementarea a durat mai mult de trei luni. Am v\u0103zut cum oamenii \u00eencep \u00eencetul cu \u00eencetul s\u0103 foloseasc\u0103 nou\u0103tatea. \u00cen primele etape a fost mult negativ. Dar acesta nu depindea deloc de procedur\u0103 sau de realizarea ei tehnic\u0103. De exemplu, un administrator folosea nu Jira, ci un plugin Jira \u00een Confluence, \u0219i anumi\u021bi lucruri nu erau accesibile pentru el. I-am ar\u0103tat Jira, iar productivitatea administratorului a crescut at\u00e2t \u00een sarcinile generale, c\u00e2t \u0219i \u00een schimb\u0103rile de discuri.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Automatizarea schimb\u0103rilor de discuri<\/h2>\n<p>\nAm abordat automatizarea schimb\u0103rilor de discuri de c\u00e2teva ori. Aveam deja ni\u0219te lucruri realizate, scripturi, dar toate func\u021bionau fie \u00een mod interactiv, fie manual, necesit\u00e2nd ini\u021biere. Abia dup\u0103 ce am implementat noua procedur\u0103 am realizat c\u0103 tocmai aceasta ne lipsea.<\/p>\n<p>Deoarece acum procesul de schimbare este \u00eemp\u0103r\u021bit \u00een etape, fiecare cu un executor desemnat \u0219i o list\u0103 de ac\u021biuni, putem activa automatizarea treptat, nu imediat \u00een \u00eentregime. De exemplu, cea mai simpl\u0103 etap\u0103 \u2014 Ready (verificarea sincroniciz\u0103rii RAID\/ datelor) poate fi delegat\u0103 cu u\u0219urin\u021b\u0103 unui bot. C\u00e2nd botul se va \u00eenv\u0103\u021ba pu\u021bin, \u00eel putem \u00eens\u0103rcina cu o sarcin\u0103 mai responsabil\u0103 \u2014 introducerea discului \u00een rota\u021bie etc.<\/p>\n<h3>Zoologicul configura\u021biilor<\/h3>\n<p>\n\u00cenainte de a vorbi despre bot, s\u0103 facem o scurt\u0103 excursie \u00een zoologicul nostru de instal\u0103ri. \u00cen primul r\u00e2nd, acesta este determinat de dimensiunea gigantic\u0103 a infrastructurii noastre. \u00cen al doilea r\u00e2nd, \u00eencerc\u0103m s\u0103 alegem o configura\u021bie optim\u0103 a hardware-ului pentru fiecare serviciu. Avem aproximativ 20 de modele de RAID hardware, \u00een principal LSI \u0219i Adaptec, dar \u00eent\u00e2lnim \u0219i HP \u0219i DELL de diferite versiuni. Fiecare controler RAID are propriul s\u0103u utilitar de management. Setul de comenzi \u0219i ie\u0219irea acestora pot varia de la o versiune la alta pentru fiecare controler RAID. Acolo unde nu se folosesc HW-RAID, poate fi mdraid.<\/p>\n<p>Practic toate noile instal\u0103ri le facem f\u0103r\u0103 rezervare de disc. \u00cencerc\u0103m s\u0103 nu mai folosim RAID hardware \u0219i software, deoarece rezerv\u0103m sistemele noastre la nivel de centre de date, nu de servere. Dar, desigur, exist\u0103 multe servere legacy care trebuie sus\u021binute.<\/p>\n<p>Undeva, discurile \u00een controlerele RAID sunt conectate ca dispozitive raw, \u00een alte cazuri se folose\u0219te JBOD. Exist\u0103 configura\u021bii cu un singur disc sistem \u00een server, iar dac\u0103 acesta trebuie \u00eenlocuit, serverul trebuie reinstalat cu sistemul de operare \u0219i aplica\u021biile, de preferat acelea\u0219i versiuni, apoi se adaug\u0103 fi\u0219ierele de configurare \u0219i se pornesc aplica\u021biile. De asemenea, exist\u0103 foarte multe grupuri de servere \u00een care redundan\u021ba se face nu la nivelul subsistemului de discuri, ci direct \u00een aplica\u021biile respective.<\/p>\n<p>\u00cen total, avem peste 400 de grupuri unice de servere, pe care ruleaz\u0103 aproximativ 100 de aplica\u021bii diferite. Pentru a acoperi un astfel de num\u0103r uria\u0219 de variante, aveam nevoie de un instrument multifunc\u021bional de automatizare. Ideal cu un DSL simplu, astfel \u00eenc\u00e2t s\u0103 poat\u0103 fi sus\u021binut nu doar de cei care l-au scris.<\/p>\n<p>Am ales Ansible, deoarece este agentless: nu a fost nevoie s\u0103 preg\u0103tim infrastructura, av\u00e2nd un start rapid. \u00cen plus, este scris \u00een Python, care este acceptat ca standard \u00een echip\u0103.<\/p>\n<h3>Schema general\u0103<\/h3>\n<p>\nS\u0103 analiz\u0103m schema general\u0103 de automatizare \u00een exemplul unui incident. Zabbix detecteaz\u0103 c\u0103 discul sdb a ie\u0219it din func\u021biune, se activeaz\u0103 un trigger, iar un ticket este creat \u00een Jira. Administratorul \u00eel examineaz\u0103, realizeaz\u0103 c\u0103 nu este un duplicat \u0219i nu este un false positive, adic\u0103 trebuie schimbat discul \u0219i \u00eel transfer\u0103 \u00een In progress.<\/p>\n<p><img decoding=\"async\" alt=\"Automatizarea \u00eenlocuirii discurilor cu ajutorul Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/673df0fe9600bc65633841222f436d37.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAplica\u021bia DiskoBot, scris\u0103 \u00een Python, interogheaz\u0103 periodic Jira pentru ticheturi noi. Ea observ\u0103 c\u0103 a ap\u0103rut un nou tiche In progress, se activeaz\u0103 threadul corespunz\u0103tor care lanseaz\u0103 playbook-ul \u00een Ansible (acest lucru se face pentru fiecare statut din Jira). \u00cen acest caz, se lanseaz\u0103 Prepare2change.<\/p>\n<p>Ansible se conecteaz\u0103 la host, scoate discul din rota\u021bie \u0219i raporteaz\u0103 statusul aplica\u021biei prin Callbacks. <\/p>\n<p><img decoding=\"async\" alt=\"Automatizarea \u00eenlocuirii discurilor cu ajutorul Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/8bfc13129f8deca640eb63ea81f616c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nCa rezultat, botul mut\u0103 automat ticheta \u00een Ready to change. Inginerul prime\u0219te o notificare \u0219i se \u00eendreapt\u0103 s\u0103 schimbe discul, dup\u0103 care mut\u0103 ticheta \u00een Changed. <\/p>\n<p><img decoding=\"async\" alt=\"Automatizarea \u00eenlocuirii discurilor cu ajutorul Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/eeda06b6966f435e2172d3f9c61b341e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDup\u0103 schema descris\u0103 mai sus, ticheta ajunge \u00eenapoi la bot, care lanseaz\u0103 un alt playbook, se conecteaz\u0103 la host \u0219i introduce discul \u00een rota\u021bie. Botul \u00eenchide ticheta. Ura!<\/p>\n<p><img decoding=\"async\" alt=\"Automatizarea \u00eenlocuirii discurilor cu ajutorul Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/51b8c7050b0c10c16ad6a6d4974c3ebf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAcum s\u0103 discut\u0103m despre unele componente ale sistemului.<\/p>\n<h3>Diskobot<\/h3>\n<p>\nAceast\u0103 aplica\u021bie este scris\u0103 \u00een Python. Ea selecteaz\u0103 tichete din Jira conform JQL. \u00cen func\u021bie de statusul tichetei, aceasta ajunge la procesorul corespunz\u0103tor, care de asemenea lanseaz\u0103 playbook-ul Ansible corespunz\u0103tor statutului.<\/p>\n<p>JQL \u0219i intervalele de sondare sunt definite \u00een fi\u0219ierul de configurare al aplica\u021biei.<\/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>\nDe exemplu, printre tichetele \u00een statutul In progress, sunt selectate doar cele ale c\u0103ror c\u00e2mpuri Disk size \u0219i Device name sunt completate. Device name este numele dispozitivului bloc, necesar pentru a rula playbook-ul. Disk size este necesar pentru ca inginerul s\u0103 \u0219tie ce dimensiune de disc este necesar\u0103.<\/p>\n<p>Iar printre tichetele cu statutul Ready, sunt filtrate tichetele cu eticheta dbot_ignore. Apropo, folosim etichetele Jira at\u00e2t pentru filtrarea de acest tip, c\u00e2t \u0219i pentru marcarea dublurilor de tichete \u0219i colectarea de statistici.<\/p>\n<p>\u00cen cazul unei erori a playbook-ului, Jira atribuie eticheta dbot_failed, pentru a putea analiza situa\u021bia ulterior. <\/p>\n<h3>Interac\u021biunea cu Ansible<\/h3>\n<p>\nAplica\u021bia interac\u021bioneaz\u0103 cu Ansible prin <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/dev_guide\/developing_api.html\">Ansible Python API<\/a><\/noindex>. \u00cen playbook_executor, transmitem numele fi\u0219ierului \u0219i un set de variabile. Acest lucru permite p\u0103strarea proiectului Ansible sub form\u0103 de fi\u0219iere yml obi\u0219nuite, f\u0103r\u0103 a-l descrie \u00een cod Python. <\/p>\n<p>De asemenea, \u00een Ansible prin *extra_vars* sunt transmise numele dispozitivului bloc, statutul tichetului, precum \u0219i callback_url, \u00een care este inclus issue key \u2014 acesta este utilizat pentru callback \u00een HTTP.<\/p>\n<p>Pentru fiecare execu\u021bie, se genereaz\u0103 un inventory temporar, format dintr-un singur host \u0219i un grup, \u00een care se afl\u0103 acest host, pentru a se aplica group_vars.<\/p>\n<p>Iat\u0103 un exemplu de task, \u00een care este implementat HTTP callback.<\/p>\n<p>Rezultatele execu\u021biilor playbook-urilor le ob\u021binem prin callback-uri. Acestea sunt de dou\u0103 tipuri:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/plugins\/callback.html\">Ansible callback plugin<\/a><\/noindex>, acesta ofer\u0103 date despre rezultatele execu\u021biei playbook-ului. Acolo sunt descrise sarcinile care au fost lansate, at\u00e2t cele executate cu succes, c\u00e2t \u0219i cele e\u0219uate. Acest callback este apelat la finalizarea playbook-ului.<\/li>\n<li>HTTP callback pentru a ob\u021bine informa\u021bii \u00een timpul execu\u021biei playbook-ului. \u00cen task-ul Ansible, efectu\u0103m o cerere POST\/GET c\u0103tre aplica\u021bia noastr\u0103.<\/li>\n<\/ul>\n<p>\nPrin HTTP callback-uri sunt transmise variabilele care au fost definite \u00een timpul execu\u021biei playbook-ului \u0219i pe care dorim s\u0103 le p\u0103str\u0103m \u0219i s\u0103 le folosim \u00een execu\u021biile ulterioare. Aceste date le scriem \u00een sqlite.<\/p>\n<p>De asemenea, prin HTTP callback l\u0103s\u0103m comentarii \u0219i modific\u0103m statutul tichetului.<\/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>Ca \u0219i multe alte sarcini asem\u0103n\u0103toare, l-am mutat \u00eentr-un fi\u0219ier comun \u0219i \u00eel includem atunci c\u00e2nd este necesar, pentru a nu-l repeta constant \u00een playbook-uri. Aici apare callback_url, \u00een care sunt codificate cheia issue \u0219i numele gazdelor. Atunci c\u00e2nd Ansible efectueaz\u0103 aceast\u0103 cerere POST, robotul \u00een\u021belege c\u0103 a sosit \u00een cadrul acestui incident.<\/p>\n<p>Iat\u0103 un exemplu din playbook, \u00een care am scos discul din dispozitivul 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>\nAceast\u0103 sarcin\u0103 schimb\u0103 statusul tichetului Jira \u00een \u201ePreg\u0103tit pentru schimbare\u201d \u0219i adaug\u0103 un comentariu. De asemenea, \u00een variabila mdam_data este p\u0103strat\u0103 lista dispozitivelor MD din care a fost eliminat discul, iar \u00een parted_info \u2014 un dump al parti\u021biei de la parted. <\/p>\n<p>C\u00e2nd inginerul va insera un disc nou, vom putea folosi aceste variabile pentru a restaura dumpul parti\u021biilor, precum \u0219i pentru a reintegra discul \u00een dispozitivele MD din care a fost eliminat.<\/p>\n<h3>Modul de verificare Ansible<\/h3>\n<p>\nA fost \u00eenfrico\u0219\u0103tor s\u0103 activ\u0103m automatizarea. A\u0219a c\u0103 am hot\u0103r\u00e2t s\u0103 rul\u0103m toate playbook-urile \u00een modul <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_checkmode.html\">us dry run<\/a><\/noindex>, \u00een care Ansible nu efectueaz\u0103 nicio ac\u021biune pe servere, ci doar le emuleaz\u0103. <\/p>\n<p>Aceast\u0103 execu\u021bie trece printr-un modul callback separat, iar rezultatul execu\u021biei playbook-ului este salvat \u00een Jira sub form\u0103 de comentariu.<\/p>\n<p><img decoding=\"async\" alt=\"Automatizarea \u00eenlocuirii discurilor cu ajutorul Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/b02d7f1dc428f2797ae8556cd496b115.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00cen primul r\u00e2nd, aceasta a permis validarea func\u021bion\u0103rii robotului \u0219i a playbook-urilor. \u00cen al doilea r\u00e2nd, a crescut \u00eencrederea administratorilor \u00een robot. <\/p>\n<p>C\u00e2nd am trecut de validare \u0219i am realizat c\u0103 putem rula Ansible nu doar \u00een modul dry run, am creat \u00een Jira un buton Run Diskobot pentru a lansa acela\u0219i playbook cu acelea\u0219i variabile pe aceea\u0219i gazd\u0103, dar \u00een modul obi\u0219nuit. <\/p>\n<p>\u00cen plus, butonul este folosit pentru a relansa playbook-ul \u00een cazul \u00een care e\u0219ueaz\u0103.<\/p>\n<h3>Structura Playbooks<\/h3>\n<p>\nAm men\u021bionat deja c\u0103, \u00een func\u021bie de statusul tichetului Jira, robotul lanseaz\u0103 playbook-uri diferite.<\/p>\n<p>\u00cen primul r\u00e2nd, astfel este mult mai u\u0219or s\u0103 organiz\u0103m intrarea. <br \/>\n\u00cen al doilea r\u00e2nd, \u00een unele cazuri, aceasta este pur \u0219i simplu necesar\u0103. <\/p>\n<p>De exemplu, atunci c\u00e2nd \u00eenlocuim discul sistemului, trebuie s\u0103 mergem mai \u00eent\u00e2i \u00een sistemul de desf\u0103\u0219urare, s\u0103 cre\u0103m o sarcin\u0103, iar dup\u0103 desf\u0103\u0219urarea corect\u0103 serverul va deveni accesibil prin ssh \u0219i putem implementa aplica\u021bia. Dac\u0103 am fi f\u0103cut tot acest lucru \u00eentr-un singur playbook, Ansible nu ar fi putut s\u0103-l execute din cauza inaccesibilit\u0103\u021bii gazdei.<\/p>\n<p>Folosim roluri Ansible pentru fiecare grup de servere. Aici se poate vedea cum sunt organizate playbook-urile \u00eentr-una dintre ele. <\/p>\n<p><img decoding=\"async\" alt=\"Automatizarea \u00eenlocuirii discurilor cu ajutorul Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/7a14035392b33f01d3182d5fff779321.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEste lucru este convenabil pentru c\u0103 este imediat clar unde sunt plasate diferitele sarcini. \u00cen main.yml, care este intrarea pentru rolul Ansible, putem avea pur \u0219i simplu un include \u00een func\u021bie de starea tichetului sau sarcini generale necesare pentru to\u021bi, de exemplu, trecerea prin identificare sau ob\u021binerea unui token.<\/p>\n<h4>Investigation.yml<\/h4>\n<p>\nSe lanseaz\u0103 pentru tichetele cu starea Investigation \u0219i Open. Cel mai important pentru acest playbook este numele dispozitivului de blocare. Aceast\u0103 informa\u021bie nu este \u00eentotdeauna disponibil\u0103. <\/p>\n<p>Pentru a o ob\u021bine, analiz\u0103m rezumatul Jira, ultimul valoarea de la trigger-ul Zabbix. Acolo poate fi numele dispozitivului de blocare \u2014 a\u0219a c\u0103 am avut noroc. Poate fi \u0219i un mount point, \u2014 atunci trebuie s\u0103 mergem pe server, s\u0103 pars\u0103m \u0219i s\u0103 calcul\u0103m discul necesar. De asemenea, trigger-ul poate transmite adresa scsi sau alte informa\u021bii. Dar sunt situa\u021bii \u00een care nu exist\u0103 indicii \u0219i trebuie s\u0103 analiz\u0103m.<\/p>\n<p>Dup\u0103 ce am aflat numele dispozitivului de blocare, str\u00e2ngem informa\u021bii despre tipul \u0219i dimensiunea discului pentru a completa c\u00e2mpurile \u00een Jira. De asemenea, ob\u021binem informa\u021bii despre furnizor, model, firmware, ID, SMART, \u0219i totul acest lucru este inserat \u00een comentariul tichetei Jira. Administratorului \u0219i inginerului nu le mai trebuie s\u0103 caute aceste date. \ud83d\ude42<\/p>\n<p><img decoding=\"async\" alt=\"Automatizarea \u00eenlocuirii discurilor cu ajutorul Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/259bf8712c013ee00d238f111b4280fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>prepare2change.yml<\/h4>\n<p>\nScoate discul din rota\u021bie, preg\u0103tindu-l pentru \u00eenlocuire. Este cea mai complex\u0103 \u0219i responsabil\u0103 etap\u0103. Aici este momentul \u00een care po\u021bi opri aplica\u021bia c\u00e2nd nu ar trebui oprit\u0103. Sau po\u021bi scoate discul de care lipseau replicile, afect\u00e2nd utilizatorii \u0219i pierz\u00e2nd unele date. Aici avem cele mai multe verific\u0103ri \u0219i notific\u0103ri \u00een chat.<\/p>\n<p>\u00cen cel mai simplu caz, este vorba despre eliminarea discului din HW\/MD RAID. <\/p>\n<p>\u00cen situa\u021bii mai complexe (\u00een sistemele noastre de stocare), c\u00e2nd rezervarea se face la nivelul aplica\u021biei, trebuie s\u0103 accedem la aplica\u021bie prin API, s\u0103 raport\u0103m despre scoaterea discului, s\u0103-l deactiv\u0103m \u0219i s\u0103 ini\u021biem restaurarea.<\/p>\n<p>Acum migr\u0103m masiv \u00een <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/odnoklassniki\/blog\/346868\">cloud<\/a><\/noindex>, \u0219i dac\u0103 serverul este cloud, atunci Diskobot se adreseaz\u0103 API-ului norului, spun\u00e2nd c\u0103 inten\u021bioneaz\u0103 s\u0103 lucreze cu acest minion \u2014 serverul pe care sunt lansate containerele \u2014 \u0219i cere \u201emigreaz\u0103 toate containerele de pe acest minion\u201d. \u0218i de asemenea, activeaz\u0103 iluminarea discului, astfel \u00eenc\u00e2t inginerul s\u0103 vad\u0103 imediat care trebuie scos.<\/p>\n<h4>changed.yml<\/h4>\n<p>\nDup\u0103 \u00eenlocuirea discului, \u00een primul r\u00e2nd verific\u0103m disponibilitatea acestuia. <\/p>\n<p>Inginerii nu instaleaz\u0103 \u00eentotdeauna discuri noi, a\u0219a c\u0103 am ad\u0103ugat o verificare a valorilor SMART care ne satisfac.<\/p>\n<p><b class=\"spoiler_title\">Ce atribute analiz\u0103m<\/b>Num\u0103rul sectoarelor reallocate (5) &lt; 100<br \/>\nNum\u0103rul sectoarelor \u00een a\u0219teptare (107) == 0<\/p>\n<p>Dac\u0103 discul nu trece testul, inginerul este informat pentru o nou\u0103 \u00eenlocuire. Dac\u0103 totul este \u00een regul\u0103, lumina se stinge, se face marcajul \u0219i discul este introdus \u00een rota\u021bie.<\/p>\n<h4>ready.yml<\/h4>\n<p>\nCel mai simplu caz: verificarea sincroniz\u0103rii HW\/SW raid sau finalizarea sincroniz\u0103rii datelor \u00een aplica\u021bie.<\/p>\n<h3>API-ul aplica\u021biilor<\/h3>\n<p>\nAm men\u021bionat de c\u00e2teva ori c\u0103 botul se conecteaz\u0103 adesea la API-ul aplica\u021biilor. Desigur, nu toate aplica\u021biile au avut metodele necesare, a\u0219a c\u0103 a trebuit s\u0103 le dezvolt\u0103m. Iat\u0103 cele mai importante metode pe care le utiliz\u0103m:<\/p>\n<ul>\n<li>Status. Starea cluster-ului sau discului, pentru a \u00een\u021belege dac\u0103 este posibil s\u0103 lucr\u0103m cu el;\n<\/li>\n<li>Start\/stop. Activarea\/dezactivarea discului;\n<\/li>\n<li>Migrate\/restore. Migrarea \u0219i restaurarea datelor \u00een timpul \u0219i dup\u0103 \u00eenlocuire.\n<\/li>\n<\/ul>\n<p><\/p>\n<h3>Experien\u021b\u0103 acumulat\u0103 despre Ansible<\/h3>\n<p>\n\u00cemi place foarte mult Ansible. Dar adesea, c\u00e2nd m\u0103 uit la diferite proiecte opensource \u0219i v\u0103d cum oamenii scriu playbook-uri, m\u0103 simt pu\u021bin speriat. Complexitatea logic\u0103 din when\/loop, lipsa flexibilit\u0103\u021bii \u0219i idempotentit\u0103\u021bii din cauza utiliz\u0103rii frecvente a shell\/command.<\/p>\n<p>Am decis s\u0103 simplific\u0103m totul, profit\u00e2nd de avantajul Ansible - modularitatea. La cel mai \u00eenalt nivel se afl\u0103 playbook-urile, care pot fi scrise de orice administrator sau dezvoltator extern care cunoa\u0219te pu\u021bin 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>Dac\u0103 o logic\u0103 este greu de implementat \u00een playbook-uri, o extragem \u00eentr-un modul sau filtrul Ansible. Scripturile pot fi scrise \u00een Python sau \u00een orice alt limbaj. <\/p>\n<p>Se scriu u\u0219or \u0219i rapid. De exemplu, modulul de iluminare a discului, exemplul de utilizare de mai sus, const\u0103 din 265 de linii.<\/p>\n<p><img decoding=\"async\" alt=\"Automatizarea \u00eenlocuirii discurilor cu ajutorul Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/08e0384bfad24f3ee61e0643ca087852.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLa cel mai de jos nivel se afl\u0103 biblioteca. Pentru acest proiect, am scris o aplica\u021bie separat\u0103, un fel de abstrac\u021bie peste hard disk-urile \u0219i RAID-urile software, care execut\u0103 cererile corespunz\u0103toare. <\/p>\n<p><img decoding=\"async\" alt=\"Automatizarea \u00eenlocuirii discurilor cu ajutorul Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/0edda3182026ce6279bd84c99613e3d6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCele mai puternice p\u0103r\u021bi ale Ansible sunt simplitatea \u0219i playbook-urile clare. Cred c\u0103 ar trebui s\u0103 profita\u021bi de asta \u0219i s\u0103 nu genera\u021bi fi\u0219iere YAML \u00eenfrico\u0219\u0103toare \u0219i o mul\u021bime de condi\u021bii, cod shell \u0219i bucle.<\/p>\n<p>Dac\u0103 dori\u021bi s\u0103 repeta\u021bi experien\u021ba noastr\u0103 cu API-ul Ansible, ave\u021bi \u00een vedere dou\u0103 lucruri:<\/p>\n<ul>\n<li>Playbook_executor \u0219i, \u00een general, playbook-ul nu poate fi transmis un timeout. Exist\u0103 un timeout pentru sesiunea ssh, dar nu pentru playbook. Dac\u0103 \u00eencerc\u0103m s\u0103 deconect\u0103m un disk care nu mai exist\u0103 \u00een sistem, playbook-ul se va executa indefinit, de aceea a trebuit s\u0103 \u00eenv\u0103luim execu\u021bia acestuia \u00eentr-un wrapper separat \u0219i s\u0103 \u00eel oprim dup\u0103 un timeout.\n<\/li>\n<li>Ansible func\u021bioneaz\u0103 pe baza proceselor fork, a\u0219a c\u0103 API-ul s\u0103u nu este thread-safe. Execut\u0103m toate playbook-urile noastre \u00eentr-un singur fir.\n<\/li>\n<\/ul>\n<p>\n\u00cen final, am reu\u0219it s\u0103 automatiz\u0103m \u00eenlocuirea a aproximativ 80 % dintre discuri. \u00cen general, viteza de \u00eenlocuire a crescut de dou\u0103 ori. Ast\u0103zi, administratorul doar se uit\u0103 la incident \u0219i decide dac\u0103 trebuie s\u0103 schimbe diskul sau nu, apoi face un singur clic.<\/p>\n<p>Dar acum \u00eencepem s\u0103 ne confrunt\u0103m cu o alt\u0103 problem\u0103: unii administratori noi nu \u0219tiu cum s\u0103 schimbe discurile. \ud83d\ude42<br \/>\n<br \/>Sursa: <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.2.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\/ro\/blog\/administrirovanie\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\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\/ro\/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\udd47Automatizarea \u00eenlocuirii discurilor cu ajutorul Ansible | ProHoster","description":"Salutare tuturor.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/34841","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=34841"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/34841\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/26233"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=34841"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=34841"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=34841"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}