Automatisering av diskbyten med hjÀlp av Ansible

Automatisering av diskbyten med hjÀlp av Ansible

Hej alla. Jag arbetar som ledande systemadministratör pÄ OK och ansvarar för portalen. Jag vill berÀtta om hur vi har byggt upp processen för automatisk byte av diskar, och hur vi sedan uteslöt administratören frÄn denna process och ersatte honom med en bot.

Den hÀr artikeln Àr en slags translitterering presentation till HighLoad+ 2018

Byggande av processen för byte av diskar

Först lite siffror

OK Àr en gigantisk tjÀnst som anvÀnds av miljontals mÀnniskor. Den stöds av cirka 7000 servrar som Àr belÀgna i 4 olika datacenter. I servrarna finns över 70 000 diskar. Om man staplar dem ovanpÄ varandra fÄr man ett torn som Àr mer Àn 1 km högt.

HÄrddiskar Àr den komponent i servern som oftast gÄr sönder. Med sÄdan volym mÄste vi byta ut cirka 30 diskar varje vecka, och denna procedur har blivit en obehaglig rutin.

Automatisering av diskbyten med hjÀlp av Ansible

Incidenter

Vi har i vÄrt företag infört en heltÀckande incidenthantering. Varje incident registrerar vi i Jira och löser och analyserar sedan. Om incidenten har pÄverkat anvÀndarna samlas vi för att fundera pÄ hur vi snabbare kan reagera i sÄdana situationer, hur vi kan minska effekten, och sjÀlvklart hur vi kan förhindra upprepning.

Lagringsenheter Àr inget undantag. Deras tillstÄnd övervakas av Zabbix. Vi bevakar meddelanden i Syslog för att upptÀcka skriv-/lÀserfel, analyserar tillstÄndet hos HW/SW-RAID, och övervakar SMART, samt berÀknar slitaget för SSD.

Hur diskar byttes tidigare

NÀr en trigger tÀnds i Zabbix skapas en incident i Jira och tilldelas automatiskt till de aktuella ingenjörerna i datacentren. Detta gör vi för alla HW-incidenter, det vill sÀga sÄdana som krÀver nÄgon form av fysiskt arbete med utrustningen i datacentret.
Ingenjören i datacentret Àr en person som hanterar frÄgor relaterade till hÄrdvaran, ansvarar för installation, underhÄll och demontering av servrar. NÀr han fÄr en biljett sÀtter han igÄng med arbetet. I diskhyllorna byter han ut diskarna sjÀlv. Men om han inte har tillgÄng till rÀtt enhet ber ingenjören jouransvariga systemadministratörer om hjÀlp. Först mÄste disken tas ur rotation. För detta behöver man göra nödvÀndiga Àndringar pÄ servern, stoppa applikationerna och avmontera disken.

Under den arbetsdagar Àr den jourhavande systemadministratören ansvarig för hela portalens funktion. Han utreder incidenter, utför reparationer och hjÀlper utvecklarna med mindre uppgifter. Han arbetar inte med hÄrddiskarna.

Tidigare kommunicerade datacentertekniker med systemadministratören via chatt. Teknikerna skickade lÀnkar till Jira-biljetter, och administratören gick igenom dem och förde en logg över arbetet i nÄgon anteckningsbok. Men för sÄdana uppgifter Àr chattar besvÀrliga: informationen Àr ostrukturerad och gÄr fort förlorad. Dessutom kunde administratören enkelt gÄ ifrÄn datorn och vara otillgÀnglig under en tid, medan teknikern stod vid servern med en hög av diskar och vÀntade.

Men det vÀrsta var att administratörerna inte sÄg hela bilden: vilka diskincidenter som fanns och var potentiella problem kunde uppstÄ. Detta beror pÄ att vi lÀmnar alla hÄrdvaruincidenter till ingenjörerna. Ja, man kunde visa alla incidenter pÄ administratörens instrumentpanel, men de Àr vÀldigt mÄnga, och administratören involverades endast i vissa av dem.

Dessutom kunde ingenjören inte korrekt prioritera, eftersom han inte visste nÄgot om syftet med de specifika servrarna eller om fördelningen av data över lagringsenheterna.

Ny procedur för byten

Det första vi gjorde var att separera alla diskincidenter till en egen typ "HW-disk" och lÀgga till fÀlten "namn pÄ blockenhet", "storlek" och "disktyp" sÄ att denna information sparades i biljetten och man inte behövde stÀndigt utbyta den i chatt.

Automatisering av diskbyten med hjÀlp av Ansible
Vi kom ocksÄ överens om att vi inom ett och samma incident skulle byta endast en disk. Detta förenklade avsevÀrt processen för automatisering, insamling av statistik och arbete i framtiden.

Dessutom lade vi till fÀltet "ansvarig administratör". Dit sÀtts den jourhavande systemadministratören automatiskt. Det Àr mycket praktiskt, eftersom ingenjören nu alltid ser vem som Àr ansvarig. Det behövs inte gÄ till kalendern och leta. Just detta fÀlt har gjort det möjligt att visa biljetter pÄ administratörens instrumentpanel dÀr hans hjÀlp kan behövas.

Automatisering av diskbyten med hjÀlp av Ansible
För att alla deltagare ska dra maximal nytta av nyheterna har vi skapat filter och instrumentpaneler och berÀttat om dem för teamet. NÀr folk förstÄr förÀndringarna distanserar de sig inte frÄn dem som nÄgot onödigt. Ingenjören behöver veta racknumret dÀr servern Àr placerad, storlek och typ pÄ disken. För administratören Àr det viktigt att först och frÀmst förstÄ vilken grupp servrar det handlar om och vilken effekt som kan uppnÄs vid diskbyte.

Att ha fÀlt och deras visning Àr praktiskt, men det löste inte behovet av att anvÀnda chattar. För detta var vi tvungna att förÀndra arbetsprocessen.

Tidigare var det sÄ hÀr:

Automatisering av diskbyten med hjÀlp av Ansible
I dag fortsÀtter ingenjörerna att arbeta sÄ hÀr nÀr de inte behöver hjÀlp av administratören.

Det första vi gjorde var att införa en ny status Investigate. I den hÀr statusen befinner sig Àrendet nÀr ingenjören Ànnu inte har bestÀmt sig för om han behöver hjÀlp frÄn administratören eller inte. Genom denna status kan ingenjören överföra Àrendet till administratören. Dessutom markerar vi Àrenden med denna status nÀr vi behöver byta disk, men sjÀlva disken inte finns pÄ plats. SÄdant sker vid CDN och avlÀgsna platser.

Vi har ocksĂ„ lagt till statusen Redo. Ärendet övergĂ„r till denna status efter diskbytet. Det vill sĂ€ga, allt Ă€r redan gjort, men HW/SW RAID synkroniseras pĂ„ servern. Detta kan ta ganska lĂ„ng tid.

Om en administratör involveras i arbetet blir schemat lite mer komplicerat.

Automatisering av diskbyten med hjÀlp av Ansible
FrĂ„n statusen Öppen kan Ă€rendet överföras bĂ„de av systemadministratören och ingenjören. I statusen In progress tar administratören ur disken frĂ„n rotation sĂ„ att ingenjören enkelt kan ta ut den: han aktiverar belysningen, avmonterar disken, stoppar applikationer beroende pĂ„ den specifika servergruppen.

Sedan övergÄr Àrendet till Ready to change: detta Àr en signal till ingenjören att disken kan tas bort. Alla fÀlt i Jira Àr redan ifyllda, ingenjören vet vilken typ och storlek pÄ disken. Dessa uppgifter fylls antingen i automatiskt i den föregÄende statusen eller av administratören.

Efter diskbytet övergĂ„r Ă€rendet till statusen Changed. Det kontrolleras att rĂ€tt disk sattes in, partitioneringen görs, applikationen startas och vissa uppgifter för datag Ă„terstĂ€llning utförs. Ärendet kan ocksĂ„ övergĂ„ till statusen Redo, i detta fall förblir administratören ansvarig, eftersom han införde disken i rotation. Det fullstĂ€ndiga schemat ser ut sĂ„ hĂ€r.

Automatisering av diskbyten med hjÀlp av Ansible
Tillkomsten av nya fÀlt har avsevÀrt underlÀttat vÄrt arbete. Teamet har börjat arbeta med strukturerad information, vilket har gjort det tydligt vad som behöver göras och i vilket steg. Prioriteringarna har blivit mycket mer relevanta, eftersom de nu stÀlls in av administratören.

Behovet av chattar har försvunnit. SjÀlvklart kan administratören skriva till ingenjören "det hÀr mÄste bytas snabbare", eller "det Àr redan kvÀll, hinner du byta?". Men vi kommunicerar inte lÀngre dagligen i chattarna om dessa frÄgor.

Diskarna byts nu i grupper. Om administratören kommer till arbetet lite tidigare och har lite ledig tid, samt inget har fungerat fel, kan han förbereda flera servrar för byte: sÀtta in fÀlt, ta bort diskar frÄn rotation och överlÀmna uppgiften till ingenjören. Ingenjören kommer lite senare till datacentret, ser uppgiften, tar de nödvÀndiga lagringsenheterna frÄn lagret och byter dem omedelbart. Som ett resultat har hastigheten pÄ bytena ökat.

Erfarenheterna frÄn att bygga arbetsflödet

  • Vid utformningen av proceduren Ă€r det nödvĂ€ndigt att samla information frĂ„n olika kĂ€llor.
    Vissa av vÄra administratörer visste inte att ingenjören bytte diskar sjÀlvstÀndigt. NÄgra trodde att ingenjörerna övervakade synkroniseringen av MD RAID, Àven om vissa av dem inte ens hade tillgÄng till det. NÄgra av de ledande ingenjörerna gjorde det, men inte alltid, eftersom processen inte var dokumenterad nÄgonstans.
  • Proceduren mĂ„ste vara enkel och tydlig.
    Det Àr svÄrt för en person att hÄlla mÄnga steg i huvudet. De viktigaste angrÀnsande statusarna i Jira mÄste lyftas upp pÄ huvudskÀrmen. Vi kan till exempel kalla "I progress" för "Redo att byta". Andra statusar kan döljas i en rullgardinsmeny sÄ att de inte stör. Men det Àr bÀttre att inte begrÀnsa mÀnniskor, ge dem möjlighet till övergÄng.
    Förklara vÀrdet av nyheterna. NÀr mÀnniskor förstÄr dem, accepterar de den nya proceduren bÀttre. Det var mycket viktigt för oss att folk inte bara klickade sig igenom hela processen, utan gick igenom den. Sedan byggde vi automatisering pÄ detta.
  • VĂ€nta, analysera, förstĂ„.
    Vi spenderade cirka en mÄnad pÄ att bygga processen, teknisk implementation, möten och diskussioner. Implementeringen tog mer Àn tre mÄnader. Jag har sett hur folk sakta börjar anvÀnda den nya funktionen. I de första skedena var det mycket negativitet. Men det hade inget att göra med sjÀlva processen eller dess tekniska implementation. Till exempel anvÀnde en administratör inte Jira, utan ett Jira-plugin i Confluence, och vissa saker var honom otillgÀngliga. NÀr vi visade honom Jira, ökade hans produktivitet bÄde nÀr det gÀllde gemensamma uppgifter och diskbyten.

Automatisering av diskbyten

Vi har försökt att automatisera diskbyten flera gÄnger. Vi hade redan arbetat fram skript, men de gick antingen i interaktivt eller manuellt lÀge och krÀvde att de startades. Endast efter implementeringen av den nya processen förstod vi att det var just det vi saknade.

Eftersom processen för byte nu Àr uppdelad i steg, dÀr varje steg har en specifik utförare och en lista med ÄtgÀrder, kan vi införa automatisering stegvis, istÀllet för att göra det helt pÄ en gÄng. Till exempel kan det enklaste steget - Ready (kontroll av RAID/data-synkronisering) enkelt delegeras till en bot. NÀr boten lÀrt sig lite kan den fÄ en mer ansvarsfull uppgift - att föra in disken i rotation, etc.

Zoologisk trÀdgÄrd av installationer

Innan vi pratar om boten, lÄt oss göra en liten översikt över vÄr zoologiska trÀdgÄrd av installationer. Först och frÀmst beror det pÄ den enorma storleken av vÄr infrastruktur. För det andra försöker vi anpassa den mest optimala hÄrdvarukonfigurationen för varje tjÀnst. Vi har cirka 20 olika modeller av hÄrdvaru-RAID, frÀmst LSI och Adaptec, men vi har Àven HP och DELL i olika versioner. Varje RAID-controller har sin egen hanteringsverktyg. Kommandosatser och deras utdata kan variera frÄn version till version för varje RAID-controller. DÀr HW-RAID inte anvÀnds kan det finnas mdraid.

NÀstan alla vÄra nya installationer gör vi utan diskreservning. Vi försöker att inte lÀngre anvÀnda hÄrdvara och mjukvara RAID, eftersom vi sÀkerhetskopierar vÄra system pÄ datacenter-nivÄ, och inte servernivÄ. Men det finns sjÀlvklart mÄnga legacy-servrar som mÄste stödjas.

NÄgonstans dirigeras diskar i RAID-kontroller raw-enheter, nÄgonstans anvÀnds JBOD. Det finns konfigurationer med en systemdisk i servern, och om den behöver bytas ut mÄste servern rullas om med installation av operativsystem och applikationer, dessutom med samma versioner, för att sedan lÀgga till konfigurationsfiler och starta applikationerna. Det finns ocksÄ mÄnga grupper av servrar dÀr redundans sker inte pÄ nivÄn av lagringssystemet, utan direkt i applikationerna sjÀlva.

Totalt har vi mer Àn 400 unika grupper av servrar som kör omkring 100 olika applikationer. För att tÀcka ett sÄ enormt antal alternativ behövde vi ett multifunktionellt automatiseringsverktyg. Helst med ett enkelt DSL, sÄ att vem som helst, inte bara den som skrev det, kan underhÄlla det.

Vi valde Ansible eftersom det Àr agentfritt: ingen förberedelse av infrastruktur behövdes, och det var enkelt att komma igÄng. Dessutom Àr det skrivet i Python, som Àr standard i teamet.

Översiktsdiagram

LÄt oss titta pÄ översiktsdiagrammet för automatisering med hjÀlp av ett exempel pÄ en incident. Zabbix detekterar att disken sdb har kraschat, en trigger tÀnds, och en ticket skapas i Jira. Administratören tittar pÄ den, inser att det inte Àr en duplikat och inte en falsk positiv, vilket innebÀr att disken mÄste bytas ut, och han överför ticketen till In progress.

Automatisering av diskbyten med hjÀlp av Ansible
Applikationen DiskoBot, skriven i Python, kontrollerar regelbundet Jira efter nya tickets. Den mÀrker att det har dykt upp en ny ticket i In progress, vilket aktiverar den motsvarande trÄden som startar playbook i Ansible (detta görs för varje status i Jira). I det hÀr fallet startas Prepare2change.

Ansible skickas till vÀrden, plockar bort disken frÄn rotation och rapporterar statusen till applikationen via Callbacks.

Automatisering av diskbyten med hjÀlp av Ansible
Baserat pÄ resultatet överför boten automatiskt ticketen till Ready to change. Ingenjören fÄr en avisering och gÄr för att byta disken, varefter han för över ticketen till Changed.

Automatisering av diskbyten med hjÀlp av Ansible
Enligt den ovanbeskrivna schemat ÄtergÄr ticketen till boten, som startar en annan playbook, gÄr till vÀrden och sÀtter in disken i rotation. Boten stÀnger ticketen. Hurra!

Automatisering av diskbyten med hjÀlp av Ansible
Nu pratar vi om nÄgra komponenter i systemet.

Diskobot

Denna applikation Àr skriven i Python. Den vÀljer tickets frÄn Jira enligt JQL. Beroende pÄ ticketens status kommer den sistnÀmnda att gÄ till den motsvarande hanteraren, som i sin tur startar den Ansible playbook som motsvarar statusen.

JQL och undersökningsintervall definieras i applikationens konfigurationsfil.

jira_states:
  investigate:
    jql: '
 status = Open and "Disk Size" is EMPTY'
    interval: 180

  inprogress:
    jql: '
  and "Disk Size" is not EMPTY and "Device Name" is not EMPTY'
 
  ready:
    jql: '
 and (labels not in ("dbot_ignore") or labels is EMPTY)'
    interval: 7200

Till exempel, bland biljetter i statusen In progress, vĂ€ljs endast de som har fĂ€lten Disk size och Device name ifyllda. Device name Ă€r namnet pĂ„ blockenheten som behövs för att köra playbook’en. Disk size behövs för att ingenjören ska veta vilken storlek pĂ„ disken som krĂ€vs.

Bland biljetter med statusen Ready filtreras biljetter med etiketten dbot_ignore. För övrigt anvÀnder vi Jira-etiketter bÄde för sÄdan filtrering och för att mÀrka dubbletter av biljetter, samt för att samla statistik.

Vid ett fel i playbook’en tilldelar Jira etiketten dbot_failed sĂ„ att det senare gĂ„r att reda ut.

Interaktion med Ansible

Applikationen interagerar med Ansible via Ansible Python API. I playbook_executor skickar vi filnamnet och en uppsÀttning variabler. Detta gör att vi kan hÄlla Ansible-projektet i form av vanliga yml-filer, istÀllet för att beskriva det i Python-kod.

Dessutom överförs namn pĂ„ blockenheten, status för biljetten och callback_url via *extra_vars*, dĂ€r frĂ„ga nyckeln Ă€r inbĂ€ddad — den anvĂ€nds för callback i HTTP.

För varje körning genereras en tillfÀllig inventory som bestÄr av en vÀrd och en grupp som denna vÀrd ingÄr i, sÄ att group_vars tillÀmpas.

HÀr Àr ett exempel pÄ en uppgift som implementerar HTTP callback.

Resultatet av playbook-körningar fÄr vi genom callback(s). De finns i tvÄ typer:

  • Ansible callback-plugin, den tillhandahĂ„ller data om resultaten av playbook-körningen. DĂ€r beskrivs uppgifter som har startats, som har genomförts framgĂ„ngsrikt eller misslyckats. Denna callback anropas vid slutet av körningen av playbook’en.
  • HTTP callback för att fĂ„ information under körningen av playbook’en. I Ansible-uppgiften gör vi en POST/GET-förfrĂ„gan till vĂ„r applikation.

Genom HTTP callback(s) överförs variabler som har definierats vid körningen av playbook’en och som vi vill spara och anvĂ€nda i kommande körningar. Dessa data skriver vi till sqlite.

Även genom HTTP callback lĂ€mnar vi kommentarer och Ă€ndrar statusen för biljetten.

HTTP callback

# Make callback to Diskobot App
# Variables:
#    callback_post_body: # A dict with follow keys. All keys are optional
#       msg: If exist it would be posted to Jira as comment
#       data: If exist it would be saved in Incident.variables
#       desire_state: Set desire_state for incident
#       status: If exist Proceed issue to that status

  - name: Callback to Diskobot app (jira comment/status)
    uri:
      url: "{{ callback_url }}/{{ devname }}"
      user: "{{ diskobot_user }}"
      password: "{{ diskobot_pass }}"
      force_basic_auth: True
      method: POST
      body: "{{ callback_post_body | to_json }}"
      body_format: json
    delegate_to: 127.0.0.1

Som mÄnga liknande uppgifter har vi flyttat det till en separat gemensam fil och inkluderar det vid behov för att inte stÀndigt upprepa det i playbooks. HÀr nÀmns callback_url, dÀr issue key och host name Àr inbÀddade. NÀr Ansible utför denna POST-begÀran förstÄr boten att den kom inom ramen för en viss incident.

HÀr Àr ett exempel frÄn playbooken dÀr vi tog bort en disk frÄn MD-enheten:

  # Save mdadm configuration
  - include: common/callback.yml
    vars:
      callback_post_body:
        status: 'Ready to change'
        msg: "Removed disk from mdraid {{ mdadm_remove_disk.msg | comment_jira }}"
        data:
          mdadm_data: "{{ mdadm_remove_disk.removed }}"
          parted_info: "{{ parted_info | default() }}"
    when:
      - mdadm_remove_disk | changed
      - mdadm_remove_disk.removed

Denna uppgift Àndrar Jira-biljetten till status "Ready to change" och lÀgger till en kommentar. Dessutom sparas listan över md-enheter frÄn vilka disken har tagits bort i variabeln mdam_data, och partitionens dump frÄn parted sparas i parted_info.

NÀr ingenjören sÀtter in en ny disk kan vi anvÀnda dessa variabler för att ÄterstÀlla partitionens dump och registrera disken i de md-enheter dÀr den togs bort.

Ansible check-lÀge

Det var skrÀmmande att aktivera automatiseringen. DÀrför beslutade vi oss för att köra alla playbooks i lÀget
dry run, i vilket Ansible inte utför nÄgra ÄtgÀrder pÄ servrarna, utan endast emulerar dem.

Denna körning gÄr genom en separat callback-modul, och resultatet av playbookens körning sparas i Jira som en kommentar.

Automatisering av diskbyten med hjÀlp av Ansible

För det första gjorde detta att vi kunde validera botens och playbookarnas funktion. För det andra ökade det administratörernas förtroende för boten.

NÀr vi genomgick valideringen och insÄg att vi kan köra Ansible inte bara i dry run-lÀget, skapade vi en knapp i Jira, Run Diskobot, för att köra samma playbook med samma variabler pÄ samma vÀrd, men i normalt lÀge.

Dessutom anvÀnds knappen för att köra om playbooken vid eventuell fel.

Strukturen för Playbooks

Jag har redan nÀmnt att beroende pÄ statusen för Jira-biljetten, kör boten olika playbooks.

För det första Àr det mycket enklare att organisera ingÄngen.
För det andra Àr det i vissa fall helt enkelt nödvÀndigt.

Till exempel, vid byte av systemdisk mÄste man först gÄ till distributionssystemet, skapa en uppgift, och efter korrekt distribution blir servern tillgÀnglig via ssh och man kan installera applikationen. Om vi hade gjort allt detta i en playbook skulle Ansible inte ha kunnat utföra den pÄ grund av vÀrdens otillgÀnglighet.

Vi anvÀnder Ansible-roller för varje servergrupp. HÀr kan man se hur playbooks Àr organiserade i en av dem.

Automatisering av diskbyten med hjÀlp av Ansible

Det Àr bekvÀmt eftersom det Àr tydligt var olika uppgifter ligger. I main.yml, som Àr ingÄngen för Ansible-rollen, kan vi ha en enkel include baserat pÄ ticketstatus eller gemensamma uppgifter som behövs för alla, till exempel identifiering eller hÀmta token.

Investigation.yml

Körs för biljetter i statusen Investigation och Open. Det viktigaste för denna playbook Àr namnet pÄ blockenheten. Denna information Àr inte alltid tillgÀnglig.

För att fĂ„ denna information analyserar vi Jira-sammanfattningen, det senaste vĂ€rdet frĂ„n Zabbix-trigger. DĂ€r kan namnet pĂ„ blockenheten finnas — om vi har tur. Annars kan det innehĂ„lla mount point, dĂ„ mĂ„ste vi gĂ„ till servern, parsa och rĂ€kna ut rĂ€tt disk. Triggern kan ocksĂ„ skicka scsi-adress eller annan information. Men ibland finns det inga ledtrĂ„dar, och vi mĂ„ste analysera.

NĂ€r vi har namnet pĂ„ blockenheten samlar vi information om typ och storlek pĂ„ disken för att fylla i fĂ€lten i Jira. Vi fĂ„r ocksĂ„ information om tillverkaren, modell, firmware, ID, SMART, och allt detta lĂ€ggs till kommentaren i Jira-ticket. Administratören och ingenjören behöver nu inte leta efter dessa uppgifter. 🙂

Automatisering av diskbyten med hjÀlp av Ansible

prepare2change.yml

Ta ut disken frÄn rotation, förbereda för byte. Det Àr det svÄraste och mest ansvarsfulla steget. HÀr kan man stanna applikationen nÀr den inte kan stoppas. Eller ta ut en disk som hade brist pÄ repliker, vilket pÄverkar anvÀndarna och kan leda till dataförlust. HÀr har vi flest kontroller och aviseringar i chatten.

I det enklaste fallet handlar det om att ta bort disken frÄn HW/MD RAID.

I mer komplexa situationer (i vÄra lagringssystem), nÀr redundans utförs pÄ applikationsnivÄ, mÄste man gÄ in i applikationen via API, rapportera om uttag av disken, inaktivera den och initiera ÄterstÀllningen.

Vi migrerar nu massivt till molnet, och om servern Ă€r molnbaserad, kontaktar Diskobot molnets API, sĂ€ger att den tĂ€nker arbeta med denna mini-server — servern dĂ€r containrar körs — och ber "migrera alla containrar frĂ„n denna mini-server". Samtidigt slĂ„r den pĂ„ diskens belysning sĂ„ att ingenjören direkt kan se vilken som behöver tas bort.

changed.yml

Efter diskbytet kontrollerar vi först dess tillgÀnglighet.

Ingenjörer byter inte alltid ut diskar, sÄ vi har lagt till en kontroll av de SMART-vÀrden som vi Àr nöjda med.

Vilka attribut tittar vi pÄReallocated Sectors Count (5) < 100
Current Pending Sector Count (107) == 0

Om disken inte klarar kontrollen meddelas ingenjören om att den ska bytas ut igen. Om allt Àr i ordning slÀcks belysningen, mÀtningen appliceras och disken tas i rotation.

ready.yml

Det enklaste fallet: kontroll av synkronisering av HW/SW raid eller avslutning av datasykronisering i applikationen.

Applikations-API

Jag har nÀmnt flera gÄnger att boten ofta kontaktar applikations-API:et. SjÀlvklart hade inte alla applikationer de nödvÀndiga metoderna, sÄ vi var tvungna att revidera dem. HÀr Àr de viktigaste metoderna som vi anvÀnder:

  • Status. Status för klustret eller disken för att förstĂ„ om det gĂ„r att arbeta med det;
  • Start/stop. Aktivering och deaktivering av disken;
  • Migrate/restore. Migrering och Ă„terstĂ€llande av data under och efter bytet.

Erfarenhet frÄn Ansible

Jag Àlskar Ansible vÀldigt mycket. Men ofta, nÀr jag ser pÄ olika opensource-projekt och ser hur folk skriver playbooks, blir jag lite skrÀmd. Komplexa logiska sammanflÀtningar av when/loop, brist pÄ flexibilitet och idempotens pÄ grund av frekvent anvÀndning av shell/command.

Vi har valt att förenkla allt sÄ mycket som möjligt genom att dra nytta av Ansibles modulÀr struktur. PÄ högsta nivÄ finns playbooks, som kan skrivas av vilken administratör som helst, extern utvecklare som har lite kunskap om Ansible.

- name: Blink disk
  become: True
  register: locate_action
  disk_locate:
      locate: '{{ locate }}'
      devname: '{{ devname }}'
      ids: '{{ locate_ids | default(pd_id) | default(omit) }}'

Om nÄgon logik Àr svÄr att implementera i playbooks, tar vi ut den i en Ansible-modul eller filter. Skripten kan skrivas antingen i Python eller vilket annat sprÄk som helst.

De Àr lÀtta och snabba att skriva. Till exempel bestÄr modulen för att blinka disken, vars anvÀndning beskrivs ovan, av 265 rader.

Automatisering av diskbyten med hjÀlp av Ansible

PÄ den lÀgsta nivÄn finns biblioteket. För detta projekt skrev vi en separat applikation, en slags abstraktion över hÄrdvaru- och mjukvaru-RAID som utför motsvarande förfrÄgningar.

Automatisering av diskbyten med hjÀlp av Ansible

Ansibles starkaste sidor Àr dess enkelhet och tydliga playbooks. Jag anser att vi bör utnyttja detta och inte generera skrÀmmande yaml-filer och en mÀngd villkor, shell-kod och loopar.

Om du vill upprepa vÄr erfarenhet med Ansible API, ha tvÄ saker i Ätanke:

  • Playbook_executor och playbook kan överhuvudtaget inte ges en timeout. Det finns en timeout för ssh-sessioner, men ingen timeout för playbook. Om vi försöker avmontera en disk som inte lĂ€ngre finns i systemet, kommer playbook att köras oĂ€ndligt, sĂ„ vi var tvungna att slĂ„ in dess körning i ett eget wrapper och döda den efter timeout.
  • Ansible Ă€r baserat pĂ„ fork-processer, sĂ„ dess API Ă€r inte trĂ„dsĂ€kert. Vi kör alla vĂ„ra playbooks entrĂ„digt.

Som ett resultat har vi lyckats automatisera bytet av cirka 80 % av diskarna. Generellt har hastigheten för bytena fördubblats. Idag tittar administratören bara pÄ incidenten och beslutar om disken behöver bytas eller inte, och gör sedan ett enda klick.

Men nu börjar vi stĂ€llas inför ett annat problem: vissa nya administratörer vet inte hur man byter diskar. 🙂

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster