
Hej alla. Jag arbetar som huvudsystemadministratör pÄ OK och ansvarar för portala stabilitet. Jag vill berÀtta om hur vi har byggt upp processen för automatisk byte av diskar, och sedan hur vi har eliminerat administratören frÄn denna process och ersatt honom med en bot.
Denna artikel Àr en slags translitterering pÄ 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 underhÄlls av cirka 7 000 servrar som Àr belÀgna i 4 olika datacenter. Det finns över 70 000 diskar i servrarna. Om man staplar dem pÄ varandra, fÄr man ett torn som Àr över 1 km hög.
HÄrddiskar Àr den komponent i servern som oftast gÄr sönder. Med sÄdana volymer tvingas vi byta ut cirka 30 diskar varje vecka, och denna procedur har blivit en mindre trevlig rutin.

Incidenter
Vi har implementerat en fullstÀndig incidenthantering i vÄrt företag. Varje incident dokumenteras i Jira, och vi löser och diskuterar dem. Om incidenten hade en effekt för anvÀndarna, samlas vi och tÀnker pÄ hur vi snabbt kan reagera i sÄdana situationer, hur vi kan minska effekten och sjÀlvklart hur vi kan förhindra upprepning.
Lagren Àr inget undantag. Deras tillstÄnd övervakas av Zabbix. Vi övervakar meddelanden i Syslog för skriv-/lÀserrors, analyserar tillstÄndet för HW/SW-RAID, och följer SMART för SSD, dÀr vi berÀknar slitage.
Hur diskar byttes tidigare
NÀr en viss trigger aktiveras i Zabbix, skapas en incident i Jira och sÀtts automatiskt till de ansvariga ingenjörerna i datacentren. Vi gör sÄ hÀr med alla hÄrdvaruincidenter, det vill sÀga sÄdana som krÀver nÄgot fysiskt arbete med hÄrdvaran i datacentret.
Datacenteringenjören Àr personen som hanterar frÄgor relaterade till hÄrdvaran, ansvarar för installation, underhÄll och demontering av servrar. NÀr ingenjören fÄr en biljett, börjar han arbeta. I diskhyllorna byter han diskar sjÀlv. Men om han inte har tillgÄng till den nödvÀndiga enheten, vÀnder sig ingenjören till de jourhavande systemadministratörerna för hjÀlp. Först och frÀmst mÄste disken tas ur rotation. För detta mÄste nödvÀndiga Àndringar göras pÄ servern, stoppa applikationerna och montera av disken.
Den jourhavande systemadministratören ansvarar under sin arbetsvecka för hela portalens funktion. Hen undersöker incidenter, utför reparationer och hjÀlper utvecklarna med mindre uppgifter. Hen arbetar dock inte med hÄrddiskarna.
Tidigare kommunicerade datacenter ingenjörer med systemadministratören i en chatt. Ingenjörerna skickade lÀnkar till Jira-Àrenden, och administratören gick igenom dem och förde logg i en anteckningsbok. Men för sÄdana uppgifter Àr chattar opraktiska: informationen Àr inte strukturerad och gÄr snabbt förlorad. Dessutom kunde administratören helt enkelt ha lÀmnat datorn och under en tid inte svara pÄ förfrÄgningar, medan ingenjören stod vid servern med en hög av diskar och vÀntade.
Men det vÀrsta var att administratörerna inte sÄg den heliga bilden: vilka diskincidenter som finns och var det potentiellt kan uppstÄ problem. Detta beror pÄ att vi överlÀmnar alla HW-incidenter till ingenjörerna. Ja, det var möjligt att visa alla incidenter pÄ administratörens dashboard. Men det finns sÄ mÄnga att administratören endast involverades i vissa av dem.
Dessutom kunde ingenjören inte korrekt prioritera, eftersom hen inte visste nÄgot om syftet med de specifika servrarna eller hur informationen Àr fördelad över lagringsenheterna.
Den nya proceduren för ersÀttning
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 Àrendet och inte hela tiden behövdes utbytas i chatten.

Vi kom ocksÄ överens om att inom ramen för en incident endast byta ut en disk. Detta har avsevÀrt förenklat processen för automatisering, insamling av statistik och arbete.
Dessutom har vi lagt till fÀltet "ansvarig administratör". DÀr sÀtts den jourhavande systemadministratören automatiskt in. Detta Àr mycket praktiskt, eftersom ingenjören nu alltid ser vem som Àr ansvarig. Det Àr inte nödvÀndigt att gÄ till kalendern och leta. Just detta fÀlt gjorde det möjligt att lyfta fram Àrenden pÄ administratörens dashboard dÀr hen eventuellt kan behöva hjÀlp.

För att alla deltagare ska fÄ ut det mesta av nyheterna har vi skapat filter och dashboards och berÀttat om dem för teamet. NÀr folk förstÄr förÀndringarna avstÄndar de sig inte frÄn dem som om de vore onödiga. En ingenjör behöver veta racknumret dÀr servern Àr placerad, samt storlek och typ av disken. En administratör behöver i första hand förstÄ vilken typ av servergrupp det handlar om och vilken effekt som kan uppnÄs vid diskbyte.
Att ha fÀlt och deras visning Àr praktiskt, men det befriar oss inte frÄn att behöva anvÀnda chattar. För att göra det var vi tvungna att Àndra arbetsflödet.
Tidigare var det sÄ hÀr:

SÄ hÀr fortsÀtter ingenjörerna att arbeta idag, nÀr de inte behöver hjÀlp frÄn administratören.
Det första vi gjorde var att införa en ny status Investigate. I denna status befinner sig Àrendet nÀr ingenjören Ànnu inte har beslutat om han behöver hjÀlp av administratören. Genom denna status kan ingenjören överföra Àrendet till administratören. Dessutom markerar vi Àrenden med denna status nÀr en disk behöver bytas, men den faktiska disken inte finns pÄ plats. Detta kan hÀnda i fall med CDN och avlÀgsna platser.
Vi har ocksĂ„ lagt till en status Redo. Ărendet överförs till denna status efter diskbytet. Det betyder att allt redan Ă€r gjort, men pĂ„ servern synkroniseras HW/SW RAID. Detta kan ta ganska lĂ„ng tid.
Om en administratör involveras blir schemat nÄgot mer komplicerat.

FrĂ„n statusen Ăppen kan Ă€rendet överföras av bĂ„de systemadministratören och ingenjören. I statusen In progress tar administratören bort disken frĂ„n rotationen sĂ„ att ingenjören kan ta ut den enkelt: han sĂ€tter pĂ„ lampan, monterar bort disken, stoppar applikationerna, beroende pĂ„ vilken typ av servergrupp det handlar om.
Sedan överförs Àrendet till Ready to change: detta Àr en signal till ingenjören om att disken kan tas ut. Alla fÀlt i Jira Àr redan ifyllda, ingenjören vet vilken typ och storlek disken har. Dessa uppgifter fylls i antingen automatiskt vid föregÄende status eller av administratören.
Efter diskbytet överförs Àrendet till statusen Changed. Det kontrolleras att rÀtt disk har satts in, partitionering görs, applikationen startas och vissa uppgifter för datagenerering eller ÄterstÀllning utförs. Dessutom kan Àrendet överföras till statusen Redo, i det fallet förblir administratören ansvarig, eftersom han var den som satte in disken i rotation. Den fullstÀndiga schemat ser ut sÄ hÀr.

TillÀgget av nya fÀlt har underlÀttat vÄrt arbete avsevÀrt. Teamet arbetar nu med strukturerad information, och det Àr tydligt vad som behöver göras och i vilket skede. Prioriteringarna har blivit mycket mer relevanta, dÄ de nu sÀtts av administratören.
Behovet av chattar har försvunnit. SjÀlvklart kan administratören skriva till ingenjören "hÀr behöver det bytas snabbare", eller "Àr det möjligt att byta innan kvÀllen?". Men vi diskuterar inte lÀngre dessa frÄgor dagligen i chattarna.
Diskarna byts nu ut i större mÀngder. Om administratören kommer till jobbet lite tidigare, har han tid över, och om inget har hÀnt kan han förbereda en rad servrar för byte: sÀtta fÀlt, ta ur diskar frÄn rotation och överlÀmna uppgiften till ingenjören. Ingenjören kommer lite senare till datacentret, ser uppgiften, hÀmtar de nödvÀndiga lagringsenheterna frÄn lagret och byter dem direkt. Som en följd har hastigheten pÄ bytet ökat.
Erfarenheter frÄn byggandet av workflow.
- Vid skapandet av proceduren behöver information samlas frÄn olika kÀllor.
Vissa av vÄra administratörer visste inte att ingenjören bytte diskar pÄ egen hand. Vissa trodde att ingenjörerna övervakade synkroniseringen av MD RAID, Àven om vissa av dem inte ens hade tillgÄng för det. Vissa ledande ingenjörer 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 nÀrstÄende statusar i Jira bör flyttas till huvudskÀrmen. Vi kan till exempel omdöpa "In progress" till "Redo att byta". De andra statusarna kan döljas i en rullgardinsmeny sÄ de inte stör ögonen. Men det Àr bÀttre att inte begrÀnsa folk, utan ge möjlighet till övergÄngar.
Förklara vÀrdet av nyheterna. NÀr mÀnniskor förstÄr, accepterar de den nya proceduren bÀttre. För oss var det mycket viktigt att mÀnniskor inte bara klickade sig igenom hela processen, utan tog sig genom den. Sedan byggde vi automatiseringen pÄ detta. - VÀnta, analysera, förstÄ.
Vi spenderade ungefÀr en mÄnad pÄ att bygga upp proceduren, den tekniska implementeringen, möten och diskussioner. Och för implementeringen tog det mer Àn tre mÄnader. Jag sÄg hur folk sakta började anvÀnda nyheten. I början var det mycket negativt. Men det berodde helt enkelt inte pÄ sjÀlva proceduren, eller dess tekniska genomförande. Till exempel anvÀnde en administratör inte Jira, utan en Jira-plugin i Confluence, och vissa saker var inte tillgÀngliga för honom. Vi visade honom Jira, och administratörens produktivitet ökade bÄde för generella uppgifter och för diskbyten.
Automatisering av diskbyten
Vi har försökt att automatisera diskbyten vid flera tillfÀllen. Vi hade redan vissa förberedelser, skript, men alla fungerade antingen interaktivt eller manuellt, och krÀvde att man startade dem. Och först efter att vi implementerat den nya proceduren insÄg vi att det var precis det vi saknade.
Eftersom processen för diskbyten nu Ă€r uppdelad i steg, dĂ€r varje steg har en ansvarig och en lista med Ă„tgĂ€rder, kan vi införa automatisering stegvis, snarare Ă€n allt pĂ„ en gĂ„ng. Till exempel kan det enklaste stegetâReady (kontroll av RAID/synkronisering av data)âlĂ€tt delegeras till en bot. NĂ€r boten har fĂ„tt lite trĂ€ning kan vi ge den mer ansvarsfulla uppgifterâinsĂ€ttning av disk i rotation osv.
Zoologisk park av installationer
Innan vi pratar om boten, lÄt oss göra en liten utflykt till vÄr zoologiska park av installationer. För det första beror den pÄ den enorma storleken av vÄr infrastruktur. För det andra försöker vi för varje tjÀnst anpassa den optimala hÄrdvarukonfigurationen. Vi har omkring 20 modeller av hÄrdvaru-RAID, frÀmst LSI och Adaptec, men Àven HP och DELL av olika versioner. Varje RAID-kontroller har sitt eget administrationsverktyg. Kommando-set och utdata frÄn dem kan variera frÄn version till version av varje RAID-kontroller. DÀr dÀr HW-RAID inte anvÀnds, kan det finnas mdraid.
NÀstan alla nya installationer gör vi utan diskreserv. Vi försöker att inte lÀngre anvÀnda hÄrdvara och mjukvara RAID, eftersom vi reserverar vÄra system pÄ datacenter-nivÄ och inte pÄ servrar. Men sjÀlvklart finns det mÄnga Àldre servrar som behöver stöd.
NÄgonstans kopplas diskar i RAID-kontroller raw-enheter, nÄgonstans anvÀnds JBOD. Det finns konfigurationer med en enda systemdisk i servern, och om den mÄste bytas ut mÄste servern rullas om med installation av operativsystem och applikationer, och dessutom samma versioner, och sedan lÀgga till konfigurationsfiler och starta applikationerna. Det finns ocksÄ mÄnga grupper av servrar dÀr redundans inte görs pÄ nivÄ av diskunderstöd, utan direkt i applikationerna sjÀlva.
Totalt har vi mer Àn 400 unika grupper av servrar som körs med cirka 100 olika applikationer. För att tÀcka ett sÄ stort antal alternativ behövde vi ett multifunktionellt automatiseringsverktyg. Helst med ett enkelt DSL sÄ att Àven den som skrev det kan stödja det.
Vi valde Ansible eftersom det Àr agentfritt: det behövde inte förbereda infrastrukturen, och uppstarten gÄr snabbt. Dessutom Àr det skrivet i Python, vilket Àr standard i teamet.
Ăversiktlig schema
LÄt oss titta pÄ det övergripande schemat för automatisering utifrÄn ett exempel pÄ ett incident. Zabbix detekterar att disken sdb har slutat fungera, en trigger sÀtts igÄng, och en ticket skapas i Jira. Administratören granskar den, inser att det inte Àr en dubblett eller en falsk positiv och att disken behöver bytas, och för över ticketen till In progress.

Applikationen DiskoBot, skriven pÄ Python, kollar regelbundet Jira efter nya tickets. Den noterar att en ny ticket In progress har dykt upp, vilket aktiverar motsvarande trÄd som startar playbooken i Ansible (detta görs för varje status i Jira). I detta fall startar den Prepare2change.
Ansible skickas till vÀrden, tar bort disken frÄn rotation och rapporterar statusen till applikationen via Callbacks.

Baserat pÄ resultaten för övergÄr boten automatiskt ticketen till Ready to change. Ingenjören fÄr en avisering och Äker för att byta disken, varefter han/han för över ticketen till Changed.

Enligt ovanstÄende schema kommer ticketen tillbaka till boten, som kör en annan playbook, gÄr till vÀrden och sÀtter in disken i rotation. Boten stÀnger ticketen. Hurra!

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Ä statusen för ticketen hamnar den hos respektive hanterare som i sin tur kör motsvarande Ansible playbook för 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 biljetterna med statusen In progress, vÀljs endast de dÀr fÀlten Disk size och Device name Àr ifyllda. Device name Àr namnet pÄ det blockenheten som behövs för att köra playbooken. Disk size Àr nödvÀndig sÄ att ingenjören vet vilken storlek pÄ disken som krÀvs.
Bland biljetterna med statusen Ready filtreras biljetter med etiketten dbot_ignore. För att nÀmna nÄgot, anvÀnder vi Jira etiketter bÄde för liknande filtrering och för att mÀrka dubbletter av biljetter samt för att samla statistik.
Vid ett misslyckande av playbooken tilldelar Jira etiketten dbot_failed, för att det senare ska kunna ÄtgÀrdas.
Interaktion med Ansible
Applikationen interagerar med Ansible genom . I playbook_executor överför vi filnamnet och en uppsÀttning variabler. Detta gör att vi kan hÄlla Ansible-projektet i form av vanliga yml-filer och inte beskriva det i Python-kod.
Ăven i Ansible överförs namnet pĂ„ blockenheten, statusen för biljetten, samt callback_url genom *extra_vars*, dĂ€r issue-nyckeln Ă€r inbĂ€ddad â den anvĂ€nds för callback i HTTP.
För varje körning genereras en temporÀr inventory, bestÄende av en vÀrd och en grupp, som innefattar denna vÀrd, för att gruppröda group_vars ska tillÀmpas.
HÀr Àr ett exempel pÄ en uppgift som implementerar HTTP callback.
Resultatet av playbook-körningar fÄr vi via callback(-er). Det finns tvÄ typer:
- , som tillhandahÄller data om resultaten av playbook-körningen. HÀr beskrivs uppgifter som har körts, antingen framgÄngsrikt eller misslyckat. Den hÀr callbacken anropas vid slutet av playbookens körning.
- HTTP callback för att fÄ information under körningen av playbooken. I Ansible-uppgiften gör vi en POST/GET-förfrÄgan till vÄr applikation.
Genom HTTP callback(-er) överförs variabler som har definierats under körningen av playbooken och som vi vill spara och anvÀnda vid framtida 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
Precis som mÄnga liknande uppgifter har vi flyttat den till en separat gemensam fil och inkluderar den vid behov sÄ att vi inte stÀndigt behöver repetera i playbooks. HÀr refereras callback_url, dÀr issue-key och vÀrdnamn Àr inbÀddade. NÀr Ansible utför denna POST-förfrÄgan 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, medan partitionen sparas i parted_info som en dump frÄn parted.
NÀr ingenjören sÀtter in en ny disk kan vi anvÀnda dessa variabler för att ÄterstÀlla partitionens dump, samt lÀgga till disken i de MD-enheter frÄn vilka den har tagits bort.
Ansible check mode
Att aktivera automation var skrÀmmande. DÀrför beslutade vi att köra alla playbooks i lÀget
, dÀr Ansible inte utför nÄgra ÄtgÀrder pÄ servrarna utan bara emulerar dem.
En sÄdan körning körs genom en separat callback-modul, och resultatet av playbooken sparas i Jira som en kommentar.

För det första gjorde detta det möjligt att validera botens och playbooks funktionalitet. För det andra ökade det förvaltarens förtroende för boten.
NÀr vi genomgick valideringen och insÄg att vi kunde köra Ansible inte bara i lÀget dry run, gjorde vi en knapp i Jira för att köra Diskobot, vilket startar 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 om den misslyckas.
Struktur av Playbooks
Jag har redan nÀmnt att beroende pÄ statusen hos Jira-biljetten, startar boten olika playbooks.
För det första Àr det mycket enklare att organisera indata.
För det andra Àr det i vissa fall helt nödvÀndigt.
Till exempel, nÀr du byter ut systemdisken behöver du först gÄ till distributionssystemet, skapa en uppgift, och efter att distributionen har genomförts korrekt, blir servern tillgÀnglig via ssh, och du kan installera applikationen pÄ den. Om vi hade gjort allt detta i en enda playbook, skulle Ansible inte kunna utföra den pÄ grund av att vÀrden inte Àr tillgÀnglig.
Vi anvÀnder Ansible-roller för varje servergrupp. HÀr Àr hur playbookarna Àr organiserade i en av dem.

Det Àr bekvÀmt eftersom man direkt ser var olika uppgifter finns. I main.yml, som Àr ingÄngen för Ansible-rollen, kan vi ha en enkel include baserat pÄ Àrendets status eller allmÀnna uppgifter som krÀvs för alla, till exempel ID-verifiering eller hÀmta token.
Investigation.yml
Det körs för Àrenden i status Investigation och Open. Det viktigaste för denna playbook Àr namnet pÄ blockenheten. Denna information Àr inte alltid tillgÀnglig.
För att fĂ„ den analyserar vi Jira-sammanfattningen, det senaste vĂ€rdet frĂ„n Zabbix-triggern. DĂ€r kan blockenhetens namn finnas â om vi Ă€r lyckligt lottade. Det kan ocksĂ„ finnas en mount point, dĂ„ mĂ„ste vi gĂ„ till servern, parsa och berĂ€kna den nödvĂ€ndiga disken. Triggern kan ocksĂ„ skicka scsi-adressen eller nĂ„gon annan information. Men ibland finns det inga ledtrĂ„dar och vi mĂ„ste analysera.
NĂ€r vi har fĂ„tt blockenhetens namn samlar vi information om typ och storlek pĂ„ disken för att fylla i fĂ€lten i Jira. Vi tar ocksĂ„ information om tillverkare, modell, firmware, ID, SMART, och lĂ€gger allt detta i kommentaren i Jira-Ă€rendet. Administratören och ingenjören behöver nu inte leta efter dessa data. đ

prepare2change.yml
Ta bort disken frÄn rotation, förbereda för byte. Det mest komplexa, ansvarsfulla steget. HÀr kan man verkligen stoppa en applikation nÀr den inte fÄr stoppas. Eller ta ut en disk som saknar repliker och dÀrmed pÄverka anvÀndarna och förlora vissa data. HÀr har vi flest kontroller och notifieringar 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 genomförs pÄ applikationsnivÄ, mÄste vi gÄ in i applikationen via API, rapportera om att disken tas bort, inaktivera den och starta ÄterhÀmtning.
Vi migrerar nu massivt till , och om servern Ă€r en molnserver, kontaktar Diskobot molnets API, meddelar att den tĂ€nker arbeta med denna minion â servern dĂ€r containrarna körs â och ber "migrera alla containrar frĂ„n denna minion". Den aktiverar ocksĂ„ diskupplysningen sĂ„ att ingenjören direkt kan se vilken som ska tas ut.
changed.yml
Efter att ha bytt disken kontrollerar vi först dess tillgÀnglighet.
Ingenjörer byter inte alltid ut de nya diskarna, sÄ vi har lagt till kontroll av de SMART-vÀrden som vi Àr nöjda med.
Vilka attributer tittar vi pÄReallocated Sectors Count (5) < 100
Current Pending Sector Count (107) == 0
Om disken inte klarar kontrollen, meddelas ingenjören om att en ny ersÀttning krÀvs. Om allt Àr i ordning stÀngs indikeringen av, markering appliceras och disken sÀtts i rotation.
ready.yml
Det enklaste fallet: kontroll av synkronisering av HW/SW raid eller slutet av datasykronisering i applikationen.
API för applikationer
Jag har nÀmnt flera gÄnger att boten ofta kontaktar API för applikationer. SjÀlvklart har inte alla applikationer de nödvÀndiga metoderna, sÄ jag var tvungen att utveckla dem. HÀr Àr de viktigaste metoderna som vi anvÀnder:
- Status. Status för klustret eller disken för att förstÄ om den gÄr att arbeta med;
- Start/stop. Aktivering-deaktivering av disken;
- Migrate/restore. Migrering och ÄterstÀllning av data under och efter ersÀttningen.
SammanstÀlld erfarenhet kring Ansible
Jag Àlskar Ansible mycket. Men ofta, nÀr jag tittar pÄ olika opensource-projekt och ser hur folk skriver playbooks, blir jag lite rÀdd. Komplexa logiska sammanflÀtningar av when/loop, brist pÄ flexibilitet och idempotens pÄ grund av frekvent anvÀndning av shell/command.
Vi beslutade att förenkla allt sÄ mycket som möjligt och dra nytta av Ansible:s modulÀritet. PÄ den högsta nivÄn finns playbooks, som kan skrivas av vilken administratör eller extern utvecklare som helst 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, flyttar vi den till en Ansible-modul eller filter. Skripten kan skrivas bÄde i Python och 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 Àr exemplifierad ovan, av 265 rader.

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.

De starkaste sidorna av Ansible Àr enkelheten och de tydliga playbooks. Jag anser att man bör utnyttja detta och inte generera skrÀmmande yaml-filer och enorma mÀngder villkor, shell-kod och loopar.
Om du vill Äterupprepa vÄr erfarenhet med Ansible API, tÀnk pÄ tvÄ saker:
- Playbook_executor och playbook i allmÀnhet kan inte ta emot 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 redan inte finns i systemet kommer playbooken att köras oÀndligt, sÄ vi var tvungna att kapsla in dess körning i en separat wrapper och döda den enligt timeout.
- Ansible fungerar pÄ grundval av fork-processer, sÄ dess API Àr inte trÄdsÀkert. Vi kör alla vÄra playbooks enkeltrÄdat.
I slutÀndan lyckades vi automatisera utbytet av cirka 80 % av diskarna. Totalt har hastigheten pÄ bytena fördubblats. Idag ser administratören bara pÄ incidenten och fattar beslut om huruvida disken behöver bytas eller inte, och dÀrefter gör han ett enda klick.
Men nu börjar vi stöta pĂ„ ett annat problem: vissa nya administratörer vet inte hur man byter diskar. đ
KĂ€lla: habr.com
