Es daudz pÄrskatu citu cilvÄku Ansible kodu un daudz rakstu pats. AnalizÄjot kļūdas (gan citu, gan manas), kÄ arÄ« vairÄkÄs intervijÄs, es sapratu galveno kļūdu, ko pieļauj Ansible lietotÄji - viÅi iekļūst sarežģītÄs lietÄs, neapgÅ«stot pamata.
Lai labotu Å”o universÄlo netaisnÄ«bu, es nolÄmu uzrakstÄ«t ievadu Ansible tiem, kas to jau zina. BrÄ«dinu, tas nav pÄrstÄsts par cilvÄkiem, tas ir sens lasÄms raksts ar daudz burtiem un bez bildÄm.
SagaidÄmais lasÄ«tÄja lÄ«menis ir tÄds, ka jau ir uzrakstÄ«ti vairÄki tÅ«kstoÅ”i jamlas rindu, kaut kas jau tiek ražots, bet "kaut kÄ viss ir greizs".
VÄrdi
GalvenÄ Ansible lietotÄja kļūda ir neziÅa, kÄ kaut ko sauc. Ja jÅ«s nezinÄt nosaukumus, jÅ«s nevarat saprast, kas teikts dokumentÄcijÄ. DzÄ«vs piemÄrs: intervijas laikÄ cilvÄks, kurÅ”, Ŕķiet, teica, ka daudz rakstÄ«jis Anible, nevarÄja atbildÄt uz jautÄjumu āno kÄdiem elementiem sastÄv rotaļu grÄmata?ā Un, kad es ierosinÄju, ka ātika gaidÄ«ta atbilde, ka rokasgrÄmata sastÄv no spÄlesā, sekoja nosodoÅ”s komentÄrs āmÄs to neizmantojamā. CilvÄki raksta Ansible naudas dÄļ un neizmanto spÄli. ViÅi to faktiski izmanto, bet nezina, kas tas ir.
TÄtad, sÄksim ar kaut ko vienkÄrÅ”u: kÄ to sauc. VarbÅ«t jÅ«s to zinÄt vai varbÅ«t nezinÄt, jo jÅ«s, lasot dokumentÄciju, nepievÄrsÄt uzmanÄ«bu.
ansible-playbook izpilda rokasgrÄmatu. RokasgrÄmata ir fails ar yml/yaml paplaÅ”inÄjumu, kura iekÅ”pusÄ ir kaut kas lÄ«dzÄ«gs Å”im:
---
- hosts: group1
roles:
- role1
- hosts: group2,group3
tasks:
- debug:
MÄs jau sapratÄm, ka viss Å”is fails ir rokasgrÄmata. MÄs varam parÄdÄ«t, kur ir lomas un kur ir uzdevumi. Bet kur ir spÄle? Un kÄda ir atŔķirÄ«ba starp spÄli un lomu vai rotaļu grÄmatu?
Tas viss ir dokumentÄcijÄ. Un viÅiem tas pietrÅ«kst. IesÄcÄji - jo to ir pÄrÄk daudz un jÅ«s neatcerÄsities visu uzreiz. PieredzÄjis - jo ātriviÄlas lietasā. Ja esat pieredzÄjis, atkÄrtoti izlasiet Ŕīs lapas vismaz reizi seÅ”os mÄneÅ”os, un jÅ«su kods kļūs par klases vadoÅ”o.
TÄtad, atcerieties: Playbook ir saraksts, kas sastÄv no spÄles un import_playbook
.
Å Ä« ir viena luga:
- hosts: group1
roles:
- role1
un Ŕī ir arī cita luga:
- hosts: group2,group3
tasks:
- debug:
Kas ir spÄlÄÅ”ana? KÄpÄc viÅa ir?
SpÄle ir spÄles grÄmatas galvenais elements, jo spÄle un tikai spÄle saista lomu un/vai uzdevumu sarakstu ar resursdatoru sarakstu, kuros tie jÄizpilda. DokumentÄcijas dziļumos jÅ«s varat atrast pieminÄjumu par delegate_to
, lokÄlie uzmeklÄÅ”anas spraudÅi, tÄ«klam raksturÄ«gi iestatÄ«jumi, pÄrejas saimniekdatori utt. Tie ļauj nedaudz mainÄ«t vietu, kur tiek veikti uzdevumi. Bet aizmirsti par to. Katrai no Ŕīm gudrajÄm iespÄjÄm ir ļoti specifisks lietojums, un tÄs noteikti nav universÄlas. Un mÄs runÄjam par pamata lietÄm, kas bÅ«tu jÄzina un jÄizmanto ikvienam.
Ja vÄlaties izpildÄ«t ākaut koā ākaut kurā, tu raksti lugu. Nav loma. Nav loma ar moduļiem un delegÄtiem. Tu Åem to un raksti lugu. KurÄ laukÄ hosts jÅ«s uzskaitÄt, kur izpildÄ«t, un lomÄs/uzdevumos - ko izpildÄ«t.
VienkÄrÅ”i, vai ne? KÄ gan varÄtu bÅ«t savÄdÄk?
Viens no raksturÄ«gÄkajiem brīžiem, kad cilvÄkiem rodas vÄlme to darÄ«t nevis rotaļÄjoties, ir āloma, kas visu nosakaā. Es vÄlÄtos iegÅ«t lomu, kas konfigurÄ gan pirmÄ tipa serverus, gan otrÄ tipa serverus.
Arhetipisks piemÄrs ir monitorings. Es vÄlÄtos iegÅ«t uzraudzÄ«bas lomu, kas konfigurÄs uzraudzÄ«bu. UzraudzÄ«bas loma tiek pieŔķirta uzraudzÄ«bas saimniekiem (saskaÅÄ ar spÄli). Bet izrÄdÄs, ka uzraudzÄ«bai mums ir jÄpiegÄdÄ paketes saimniekiem, kurus mÄs uzraugÄm. KÄpÄc neizmantot delegÄtu? Jums arÄ« jÄkonfigurÄ iptables. deleÄ£Ät? Lai iespÄjotu uzraudzÄ«bu, jums arÄ« jÄraksta/jÄlabo DBVS konfigurÄcija. deleÄ£Ät! Un, ja trÅ«kst radoÅ”uma, tad varat izveidot delegÄciju include_role
ligzdotÄ cilpÄ, izmantojot sarežģītu filtru grupu sarakstÄ un iekÅ”pusÄ include_role
jÅ«s varat darÄ«t vairÄk delegate_to
atkal. Un mÄs ejam prom...
Laba vÄlme - bÅ«t vienai uzraudzÄ«bas lomai, kas "dara visu" - ieved mÅ«s pilnÄ«gÄ ellÄ, no kuras visbiežÄk ir tikai viena izeja: pÄrrakstÄ«t visu no nulles.
Kur Å”eit radÄs kļūda? BrÄ«dÄ«, kad atklÄjÄt, ka, lai veiktu uzdevumu āxā resursdatorÄ X, ir jÄdodas uz saimniekdatoru Y un jÄveic āyā tur, jums bija jÄveic vienkÄrÅ”s uzdevums: jÄiet un jÄuzraksta atskaÅoÅ”ana, ko resursdatorÄ Y veic y. Nepievienojiet kaut ko "x", bet rakstiet to no nulles. Pat ar cietÄ kodiem mainÄ«gajiem.
Å Ä·iet, ka viss iepriekÅ” minÄtajÄs rindkopÄs ir pateikts pareizi. Bet tas nav tavs gadÄ«jums! Jo jÅ«s vÄlaties rakstÄ«t atkÄrtoti lietojamu kodu, kas ir DRY un bibliotÄkai lÄ«dzÄ«gs, un jums ir jÄmeklÄ metode, kÄ to izdarÄ«t.
Å eit slÄpjas vÄl viena nopietna kļūda. Kļūda, kas daudzus projektus no pieļaujami uzrakstÄ«tiem (varÄtu bÅ«t labÄk, bet viss strÄdÄ un ir viegli pabeigt) pÄrvÄrta par pilnÄ«gÄm Å”ausmÄm, kuras pat autors nevar izdomÄt. Tas darbojas, bet nedod Dievs kaut ko mainÄ«t.
Kļūda ir Å”Äda: loma ir bibliotÄkas funkcija. Å Ä« lÄ«dzÄ«ba ir izpostÄ«jusi tik daudz labu sÄkumu, ka to ir vienkÄrÅ”i skumji skatÄ«ties. Loma nav bibliotÄkas funkcija. ViÅa nevar veikt aprÄÄ·inus un nevar pieÅemt spÄles lÄ«meÅa lÄmumus. AtgÄdinÄt man, kÄdus lÄmumus pieÅem spÄle?
Paldies, tev taisnÄ«ba. Play pieÅem lÄmumu (precÄ«zÄk, tajÄ ir informÄcija) par to, kÄdus uzdevumus un lomas veikt uz kuriem saimniekiem.
Ja jÅ«s deleÄ£Äjat Å”o lÄmumu kÄdai lomai un pat ar aprÄÄ·iniem, jÅ«s nolemjat sevi (un to, kurÅ” mÄÄ£inÄs parsÄt jÅ«su kodu) nožÄlojamai eksistencei. Loma neizlemj, kur tÄ tiek izpildÄ«ta. Å o lÄmumu pieÅem spÄle. Loma dara to, ko tai saka, kur tÄ saka.
KÄpÄc ir bÄ«stami programmÄt Ansible un kÄpÄc COBOL ir labÄks par Ansible, mÄs runÄsim nodaÄ¼Ä par mainÄ«gajiem un džindzÄm. PagaidÄm teiksim vienu ā katrs jÅ«su aprÄÄ·ins atstÄj aiz sevis neizdzÄÅ”amas globÄlo mainÄ«go izmaiÅu pÄdas, un jÅ«s neko nevarat darÄ«t lietas labÄ. TiklÄ«dz abas āpÄdasā krustojÄs, viss bija pazudis.
PiezÄ«me ÄÄ«kstÄtÄjiem: loma noteikti var ietekmÄt kontroles plÅ«smu. Äst delegate_to
un tam ir saprÄtÄ«gs lietojums. Äst meta: end host/play
. Bet! Atcerieties, ka mÄs mÄcÄm pamatus? Aizmirsu par delegate_to
. MÄs runÄjam par vienkÄrÅ”Äko un skaistÄko Ansible kodu. Kuru ir viegli lasÄ«t, viegli rakstÄ«t, viegli atkļūdot, viegli pÄrbaudÄ«t un viegli pabeigt. TÄtad, vÄlreiz:
spÄlÄt un tikai spÄle izlemj, kurÅ” saimnieks kas tiek izpildÄ«ts.
Å ajÄ sadaÄ¼Ä mÄs aplÅ«kojÄm spÄles un lomas pretestÄ«bu. Tagad parunÄsim par uzdevumu un lomu attiecÄ«bÄm.
Uzdevumi un lomas
Apsveriet spÄli:
- hosts: somegroup
pre_tasks:
- some_tasks1:
roles:
- role1
- role2
post_tasks:
- some_task2:
- some_task3:
PieÅemsim, ka jums ir jÄdara foo. Un tÄ izskatÄs foo: name=foobar state=present
. Kur man tas bÅ«tu jÄraksta? in pre? pastu? Vai izveidot lomu?
...Un kur palika uzdevumi?
MÄs atkal sÄkam ar pamatlietÄm - atskaÅoÅ”anas ierÄ«ci. Ja jÅ«s peldat par Å”o jautÄjumu, jÅ«s nevarat izmantot spÄli kÄ pamatu visam pÄrÄjam, un jÅ«su rezultÄts bÅ«s "trÄ«coÅ”s".
AtskaÅoÅ”anas ierÄ«ce: saimniekdatora direktÄ«va, paÅ”as spÄles iestatÄ«jumi un pre_tasks, uzdevumi, lomas, post_tasks sadaļas. AtlikuÅ”ie spÄles parametri mums Å”obrÄ«d nav svarÄ«gi.
ViÅu sadaļu secÄ«ba ar uzdevumiem un lomÄm: pre_tasks
, roles
, tasks
, post_tasks
. TÄ kÄ semantiski izpildes secÄ«ba ir starp tasks
Šø roles
nav skaidrs, tad paraugprakse saka, ka mÄs pievienojam sadaļu tasks
, tikai tad, ja nÄ roles
... Ja tur ir roles
, tad visi pievienotie uzdevumi tiek ievietoti sadaļÄs pre_tasks
/post_tasks
.
Atliek tikai, ka viss ir semantiski skaidrs: pirmkÄrt pre_tasks
tad roles
tad post_tasks
.
Bet mÄs joprojÄm neesam atbildÄjuÅ”i uz jautÄjumu: kur ir moduļa izsaukums? foo
rakstÄ«t? Vai katram modulim ir jÄraksta visa loma? Vai arÄ« labÄk ir bieza loma visam? Un ja ne lomu, tad kur lai raksta - pre vai post?
Ja uz Å”iem jautÄjumiem nav pamatotas atbildes, tad tÄ liecina par intuÄ«cijas trÅ«kumu, tas ir, to paÅ”u "trÄ«cÄ«go pamatu". IzdomÄsim. PirmkÄrt, droŔības jautÄjums: ja spÄlÄ ir pre_tasks
Šø post_tasks
(un nav uzdevumu vai lomu), tad var kaut kas salūzt, ja izpildu pirmo uzdevumu no post_tasks
Es to pÄrcelÅ”u uz beigÄm pre_tasks
?
Protams, jautÄjuma formulÄjums liecina, ka tas salÅ«zÄ«s. Bet ko tieÅ”i?
... ApdarinÄtÄji. Izlasot pamatinformÄciju, atklÄjas svarÄ«gs fakts: visi apstrÄdÄtÄji tiek automÄtiski izskaloti pÄc katras sadaļas. Tie. visi uzdevumi no pre_tasks
, pÄc tam visi apstrÄdÄtÄji, kuriem tika paziÅots. PÄc tam tiek izpildÄ«tas visas lomas un visi apstrÄdÄtÄji, par kuriem tika paziÅots lomÄs. PÄc post_tasks
un to apstrÄdÄtÄji.
TÄdÄjÄdi, ja velkat uzdevumu no post_tasks
Š² pre_tasks
, tad, iespÄjams, jÅ«s to izpildÄ«sit pirms apdarinÄtÄja izpildes. piemÄram, ja iekÅ”Ä pre_tasks
tÄ«mekļa serveris ir instalÄts un konfigurÄts, un post_tasks
tai kaut kas tiek nosÅ«tÄ«ts, pÄc tam pÄrsÅ«tiet Å”o uzdevumu uz sadaļu pre_tasks
novedÄ«s pie tÄ, ka āsÅ«tÄ«Å”anasā laikÄ serveris vÄl nedarbosies un viss sabojÄsies.
Tagad padomÄsim vÄlreiz, kÄpÄc mums tas ir vajadzÄ«gs pre_tasks
Šø post_tasks
? PiemÄram, lai pabeigtu visu nepiecieÅ”amo (arÄ« hendlerus) pirms lomas izpildes. A post_tasks
ļaus mums strÄdÄt ar lomu izpildes rezultÄtiem (ieskaitot apstrÄdÄtÄjus).
AsprÄtÄ«gs Ansible eksperts mums pastÄstÄ«s, kas tas ir. meta: flush_handlers
, bet kÄpÄc mums ir vajadzÄ«gi flush_handlers, ja mÄs varam paļauties uz sekciju izpildes secÄ«bu spÄlÄ? TurklÄt meta: flush_handlers izmantoÅ”ana var sniegt mums negaidÄ«tas lietas ar dublÄtiem apstrÄdÄtÄjiem, sniedzot dÄ«vainus brÄ«dinÄjumus when
Ń block
utt. Jo labÄk jÅ«s zinÄt iespÄjamos risinÄjumus, jo vairÄk nianses varat nosaukt "kutenÄ«gam" risinÄjumam. Un vienkÄrÅ”s risinÄjums ā izmantojot dabisku sadalÄ«jumu starp pirms/lomÄm/post ā nianses nerada.
Un atpakaļ pie mÅ«su āfooā. Kur man to likt? Pirms, amatÄ vai lomÄs? AcÄ«mredzot tas ir atkarÄ«gs no tÄ, vai mums ir nepiecieÅ”ami foo apstrÄdÄtÄja rezultÄti. Ja to nav, tad foo nav jÄievieto ne pirms, ne pÄc - Ŕīm sadaļÄm ir Ä«paÅ”a nozÄ«me - uzdevumu izpilde pirms un pÄc koda galvenÄ korpusa.
Tagad atbilde uz jautÄjumu āloma vai uzdevumsā ir saistÄ«ta ar to, kas jau ir spÄlÄ - ja tur ir uzdevumi, tad tie jÄpievieno uzdevumiem. Ja ir lomas, jums ir jÄizveido loma (kaut vai no viena uzdevuma). AtgÄdinÄÅ”u, ka uzdevumi un lomas netiek izmantoti vienlaikus.
Izpratne par Ansible pamatiem sniedz pamatotas atbildes uz Ŕķietami gaumes jautÄjumiem.
Uzdevumi un lomas (otrÄ daļa)
Tagad apspriedÄ«sim situÄciju, kad jÅ«s tikko sÄkat rakstÄ«t rokasgrÄmatu. Vajag taisÄ«t foo, bar un baz. Vai Å”ie trÄ«s uzdevumi ir viena loma vai trÄ«s lomas? RezumÄjot jautÄjumu: kurÄ brÄ«dÄ« jÄsÄk rakstÄ«t lomas? KÄda jÄga rakstÄ«t lomas, ja var rakstÄ«t uzdevumus?... Kas ir loma?
Viena no lielÄkajÄm kļūdÄm (es par to jau runÄju) ir domÄt, ka loma ir kÄ funkcija programmas bibliotÄkÄ. KÄ izskatÄs vispÄrÄ«gs funkcijas apraksts? TÄ pieÅem ievades argumentus, mijiedarbojas ar blakuscÄloÅiem, rada blakusparÄdÄ«bas un atgriež vÄrtÄ«bu.
Tagad uzmanÄ«bu. Ko no tÄ var izdarÄ«t lomÄ? JÅ«s vienmÄr esat laipni aicinÄti saukt par blakusefektiem, tÄ ir visa Ansible bÅ«tÄ«ba - radÄ«t blakusparÄdÄ«bas. Vai ir blakus cÄloÅi? ElementÄri. Bet ar "nododiet vÄrtÄ«bu un atdodiet to" - tas ir, kur tas nedarbojas. PirmkÄrt, lomai nevar nodot vÄrtÄ«bu. Lomas sadaÄ¼Ä Vars varat iestatÄ«t globÄlu mainÄ«go ar spÄlÄÅ”anas ilgumu. LomÄ varat iestatÄ«t globÄlu mainÄ«go, kas darbojas visu mūžu. Vai pat ar rokasgrÄmatu kalpoÅ”anas laiku (set_fact
/register
). Bet jums nevar bÅ«t "vietÄjie mainÄ«gie". JÅ«s nevarat "paÅemt vÄrtÄ«bu" un "atgriezt to".
Galvenais no tÄ izriet: jÅ«s nevarat kaut ko uzrakstÄ«t Ansible, neradot blakusparÄdÄ«bas. GlobÄlo mainÄ«go maiÅa vienmÄr ir funkcijas blakusefekts. PiemÄram, RustÄ globÄlÄ mainÄ«gÄ mainÄ«Å”ana ir unsafe
. Un Ansible tÄ ir vienÄ«gÄ metode, kÄ ietekmÄt lomas vÄrtÄ«bas. Å
emiet vÄrÄ lietotos vÄrdus: nevis "nodot lomai vÄrtÄ«bu", bet "mainÄ«t lomas izmantotÄs vÄrtÄ«bas". Starp lomÄm nav izolÄcijas. Starp uzdevumiem un lomÄm nav izolÄcijas.
KopÄ: loma nav funkcija.
Kas Å”ajÄ lomÄ ir labs? PirmkÄrt, lomai ir noklusÄjuma vÄrtÄ«bas (/default/main.yaml
), otrkÄrt, lomai ir papildu direktoriji failu glabÄÅ”anai.
KÄdas ir noklusÄjuma vÄrtÄ«bu priekÅ”rocÄ«bas? TÄ kÄ Maslova piramÄ«dÄ, Ansible diezgan izkropļotajÄ mainÄ«go prioritÄÅ”u tabulÄ, lomu noklusÄjumiem ir viszemÄkÄ prioritÄte (atskaitot Ansible komandrindas parametrus). Tas nozÄ«mÄ, ka, ja jums ir jÄnorÄda noklusÄjuma vÄrtÄ«bas un nav jÄuztraucas par to, ka tÄs ignorÄs krÄjumu vai grupu mainÄ«go vÄrtÄ«bas, lomu noklusÄjuma vÄrtÄ«bas ir jums vienÄ«gÄ Ä«stÄ vieta. (Nedaudz meloju - ir vÄl |d(your_default_here)
, bet, ja runÄjam par stacionÄrÄm vietÄm, tad tikai lomu noklusÄjuma).
Kas vÄl ir lielisks lomÄs? Jo viÅiem ir savi katalogi. Tie ir direktoriji mainÄ«gajiem lielumiem, gan nemainÄ«giem (t.i., aprÄÄ·inÄtiem lomai), gan dinamiskiem (ir vai nu modelis, vai pretmodelis - include_vars
ar {{ ansible_distribution }}-{{ ansible_distribution_major_version }}.yml
.). Å ie ir katalogi files/
, templates/
. Tas arÄ« ļauj jums izveidot savus moduļus un spraudÅus (library/
). Bet, salÄ«dzinot ar uzdevumiem rokasgrÄmatÄ (kurÄ var bÅ«t arÄ« tas viss), vienÄ«gais labums Å”eit ir tas, ka faili netiek sabÄrti vienÄ kaudzÄ, bet gan vairÄkÄs atseviŔķÄs kaudzÄ«tÄs.
VÄl viena detaļa: varat mÄÄ£inÄt izveidot lomas, kas bÅ«s pieejamas atkÄrtotai izmantoÅ”anai (izmantojot galaktiku). LÄ«dz ar kolekciju parÄdÄ«Å”anos lomu sadalÄ«jumu var uzskatÄ«t par gandrÄ«z aizmirstu.
TÄdÄjÄdi lomÄm ir divas svarÄ«gas funkcijas: tÄm ir noklusÄjuma iestatÄ«jumi (unikÄla funkcija), un tÄs ļauj strukturÄt kodu.
Atgriežoties pie sÄkotnÄjÄ jautÄjuma: kad veikt uzdevumus un kad pildÄ«t lomas? Uzdevumi rotaļu grÄmatÄ visbiežÄk tiek izmantoti vai nu kÄ ālÄ«meā pirms/pÄc lomÄm, vai arÄ« kÄ neatkarÄ«gs bÅ«ves elements (tad kodÄ lomÄm nevajadzÄtu bÅ«t). NormÄlu uzdevumu kaudze, kas sajaukta ar lomÄm, ir nepÄrprotama pavirŔība. Jums vajadzÄtu pieturÄties pie noteikta stila - vai nu uzdevuma, vai lomas. Lomas nodroÅ”ina entÄ«tiju un noklusÄjuma atdalÄ«Å”anu, uzdevumi ļauj ÄtrÄk lasÄ«t kodu. Parasti lomÄs tiek ievietots āstacionÄrÄksā (svarÄ«gÄks un sarežģītÄks) kods, un palÄ«gskripti tiek rakstÄ«ti uzdevuma stilÄ.
Ir iespÄjams veikt import_role kÄ uzdevumu, bet, ja rakstÄt Å”o, tad esiet gatavs izskaidrot savai skaistuma izjÅ«tai, kÄpÄc vÄlaties to darÄ«t.
AsprÄtÄ«gs lasÄ«tÄjs var teikt, ka lomas var importÄt lomas, lomÄm var bÅ«t atkarÄ«bas, izmantojot galaxy.yml, un ir arÄ« Å”ausmÄ«gs un briesmÄ«gs include_role
ā AtgÄdinu, ka pilnveidojam iemaÅas pamata Ansible, nevis daiļvingroÅ”anÄ.
VadÄ«tÄji un uzdevumi
ApspriedÄ«sim vÄl vienu acÄ«mredzamu lietu: hendleri. ZinÄt, kÄ tos pareizi lietot, ir gandrÄ«z mÄksla. KÄda ir atŔķirÄ«ba starp hendleri un vilkÅ”anu?
TÄ kÄ mÄs atceramies pamatus, Å”eit ir piemÄrs:
- hosts: group1
tasks:
- foo:
notify: handler1
handlers:
- name: handler1
bar:
Lomas apstrÄdÄtÄji atrodas failÄ rolename/handlers/main.yaml. ApdarinÄtÄji rakÅÄjas starp visiem spÄles dalÄ«bniekiem: pirms/pÄc_uzdevumi var izvilkt lomu apdarinÄtÄjus, un loma var izvilkt apdarinÄtÄjus no spÄles. TomÄr "savstarpÄju lomu" zvani apstrÄdÄtÄjiem rada daudz vairÄk wtf nekÄ triviÄla apdarinÄtÄja atkÄrtoÅ”ana. (VÄl viens paraugprakses elements ir mÄÄ£inÄt neatkÄrtot apstrÄdÄtÄju vÄrdus).
GalvenÄ atŔķirÄ«ba ir tÄ, ka uzdevums vienmÄr tiek izpildÄ«ts (idempotenciÄli) (plus/mÄ«nus atzÄ«mes un when
), un apstrÄdÄtÄjs - pÄc stÄvokļa maiÅas (ziÅot par ugunsgrÄkiem tikai tad, ja tas ir mainÄ«ts). Ko tas nozÄ«mÄ? PiemÄram, to, ka, restartÄjot, ja nekas nav mainÄ«ts, tad arÄ« apstrÄdÄtÄja nebÅ«s. KÄpÄc mums ir jÄizpilda apdarinÄtÄjs, ja Ä£enerÄjoÅ”ais uzdevums nav mainÄ«jies? PiemÄram, tÄpÄc, ka kaut kas salÅ«za un mainÄ«jÄs, bet izpilde nesasniedza apstrÄdÄtÄju. PiemÄram, tÄpÄc, ka tÄ«kls Ä«slaicÄ«gi nedarbojÄs. KonfigurÄcija ir mainÄ«ta, pakalpojums nav restartÄts. NÄkamajÄ reizÄ, kad to startÄjat, konfigurÄcija vairs nemainÄs, un pakalpojums paliek vecajÄ konfigurÄcijas versijÄ.
SituÄciju ar konfigurÄciju nevar atrisinÄt (precÄ«zÄk, var pats izdomÄt speciÄlu restartÄÅ”anas protokolu ar failu karodziÅiem utt., bet tas vairs nav 'pamata iespÄja' nekÄdÄ veidÄ). Bet ir vÄl viens izplatÄ«ts stÄsts: mÄs instalÄjÄm lietojumprogrammu, ierakstÄ«jÄm to .service
-failu, un tagad mÄs to vÄlamies daemon_reload
Šø state=started
. Un Ŕķiet, ka dabiskÄ vieta tam ir apstrÄdÄtÄjs. Bet, ja jÅ«s padarÄt to nevis par apdarinÄtÄju, bet gan par uzdevumu uzdevumu saraksta vai lomas beigÄs, tas katru reizi tiks izpildÄ«ts idempotenciÄli. Pat ja rokasgrÄmata salÅ«za vidÅ«. Tas nemaz neatrisina restartÄÅ”anas problÄmu (ar restartÄtu atribÅ«tu nevar veikt uzdevumu, jo idempotence zÅ«d), taÄu noteikti ir vÄrts izdarÄ«t status=started, palielinÄs kopÄjÄ playbook stabilitÄte, jo samazinÄs savienojumu skaits un dinamiskais stÄvoklis.
VÄl viena apdarinÄtÄja pozitÄ«va Ä«paŔība ir tÄda, ka tas neaizsprosto izvadi. NekÄdu izmaiÅu nebija - izlaidÄ nav izlaista vai ok - vieglÄk lasÄ«t. TÄ ir arÄ« negatÄ«va Ä«paŔība ā ja jau pirmajÄ palaiÅ”anas reizÄ atrodat drukas kļūdu lineÄri izpildÄ«tÄ uzdevumÄ, tad apdarinÄtÄji tiks izpildÄ«ti tikai tad, kad tie tiks mainÄ«ti, t.i. dažos apstÄkļos - ļoti reti. PiemÄram, pirmo reizi mÅ«Å¾Ä pÄc pieciem gadiem. Un, protams, nosaukumÄ bÅ«s drukas kļūda un viss salÅ«zÄ«s. Un, ja jÅ«s tos nepalaižat otro reizi, nekas nemainÄs.
AtseviŔķi mums jÄrunÄ par mainÄ«go lielumu pieejamÄ«bu. PiemÄram, ja par uzdevumu paziÅosit ar cilpu, kas bÅ«s mainÄ«gajos? JÅ«s varat uzminÄt analÄ«tiski, taÄu tas ne vienmÄr ir triviÄls, it Ä«paÅ”i, ja mainÄ«gie nÄk no dažÄdÄm vietÄm.
... TÄtad apstrÄdÄtÄji ir daudz mazÄk noderÄ«gi un daudz problemÄtiskÄki, nekÄ Å”Ä·iet. Ja varat kaut ko skaisti uzrakstÄ«t (bez volÄniem) bez apdarinÄtÄjiem, labÄk to darÄ«t bez tiem. Ja tas neizdodas skaisti, labÄk ar viÅiem.
KodÄ«gais lasÄ«tÄjs pareizi norÄda, ka mÄs neesam apsprieduÅ”i listen
ka apdarinÄtÄjs var izsaukt paziÅojumu citam apdarinÄtÄjam, ka apdarinÄtÄjs var ietvert import_tasks (kas var veikt include_role ar with_items), ka apdarinÄtÄja sistÄma Ansible ir TjÅ«ringa pilnÄ«ga, ka apdarinÄtÄji no include_role ziÅkÄrÄ«gÄ veidÄ krustojas ar apdarinÄtÄjiem no spÄles, utt. .d. - tas viss acÄ«mredzami nav āpamatsā).
Lai gan ir viena konkrÄta WTF, kas patiesÄ«bÄ ir funkcija, kas jums jÄpatur prÄtÄ. Ja jÅ«su uzdevums tiek izpildÄ«ts ar delegate_to
un tam ir paziÅots, tad atbilstoÅ”ais apdarinÄtÄjs tiek izpildÄ«ts bez delegate_to
, t.i. resursdatorÄ, kuram ir pieŔķirta atskaÅoÅ”ana. (Lai gan apdarinÄtÄjam, protams, var bÅ«t delegate_to
Tas pats).
AtseviŔķi es vÄlos teikt dažus vÄrdus par atkÄrtoti lietojamÄm lomÄm. Pirms kolekciju parÄdÄ«Å”anÄs bija doma, ka varÄtu izveidot universÄlas lomas, kas varÄtu bÅ«t ansible-galaxy install
un aizgÄja. StrÄdÄ uz visÄm OS un visu variantu visÄs situÄcijÄs. TÄtad, mans viedoklis: tas nedarbojas. Jebkura loma ar masu include_vars
, kas atbalsta 100500 1 gadÄ«jumu, ir lemts stÅ«ra korpusa kļūdu bezdibenim. Tos var veikt ar masveida testÄÅ”anu, taÄu, tÄpat kÄ ar jebkuru testÄÅ”anu, jums ir ievades vÄrtÄ«bu un kopÄjÄs funkcijas Dekarta reizinÄjums, vai arÄ« jums ir āaptverti atseviŔķi scenÄrijiā. Mans viedoklis ir tÄds, ka ir daudz labÄk, ja loma ir lineÄra (ciklomÄtiskÄ sarežģītÄ«ba XNUMX).
Jo mazÄk if (skaidri vai deklaratÄ«vi - formÄ when
vai forma include_vars
pÄc mainÄ«go kopas), jo labÄka loma. ReizÄm jÄtaisa zari, bet, atkÄrtoju, jo mazÄk, jo labÄk. TÄpÄc Ŕķiet, ka tÄ ir laba loma ar galaktiku (tas darbojas!) ar daudzÄm lietÄm when
var bÅ«t mazÄk vÄlama nekÄ āsavÄā loma no pieciem uzdevumiem. BrÄ«dis, kad loma ar galaktiku ir labÄka, ir tad, kad sÄc kaut ko rakstÄ«t. BrÄ«dis, kad kļūst sliktÄk, ir tad, kad kaut kas saplÄ«st un rodas aizdomas, ka tas ir ālomas ar galaktikuā dÄļ. JÅ«s to atverat, un ir pieci ieslÄgumi, astoÅas uzdevumu lapas un kaudze when
'ov... Un mums tas ir jÄizdomÄ. 5 uzdevumu vietÄ lineÄrs saraksts, kurÄ nav ko lauzt.
TurpmÄkajÄs daļÄs
- Mazliet par krÄjumiem, grupu mainÄ«gajiem, spraudni host_group_vars, hostvars. KÄ piesiet Gordija mezglu ar spageti. DarbÄ«bas jomas un prioritÄtes mainÄ«gie, IespÄjamÄs atmiÅas modelis. "TÄtad, kur mÄs glabÄjam datu bÄzes lietotÄjvÄrdu?"
jinja: {{ jinja }}
ā nosql notype nosense mÄ«kstais plastilÄ«ns. Tas ir visur, pat tur, kur jÅ«s to negaidÄt. Mazliet par!!unsafe
un garŔīgs jamss.
Avots: www.habr.com