Kodėl Ansible nėra visiškai galima naudoti deklaratyvų požiūrį visuose playbook'uose?
sobes.tech AI
Atsakymas iš AI
Ansible siekia būti deklaratyvus, aprašydamas norimą sistemos būseną. Tačiau visiška deklaratyvumas yra ribojamas dėl būtinybės vykdyti seką operacijų ir priklausomybių tarp užduočių, kas kartais reikalauja imperatyvaus požiūrio siekiant teisingai pasiekti galutinę būseną. Kai kurie moduliai ar užduotys gali reikalauti vykdyti veiksmus tam tikra tvarka arba priklausyti nuo ankstesnių užduočių išvesties.
Pavyzdžiai:
- Sąlyginių užduočių vykdymas:
when:naudojimas, kad užduotis būtų vykdoma tik tam tikromis sąlygomis, gali pažeisti gryną deklaratyvumą, nes sąlyga dažnai grindžiama dabartine (o ne norima galutine) būsena arba ankstesnės užduoties rezultatu. registerirchanged_whennaudojimas: Užduoties išvesties išsaugojimas kintamajame (register) ir šio išvesties naudojimas vėlesnėse užduotyse arba „pasikeitimo“ nustatymas (changed_when) taip pat yra imperatyvus elementas.- Komandų vykdymo moduliai:
command,shell,scriptmoduliai savo prigimtimi yra imperatyvūs, nes jie tiesiog vykdo nurodytą komandą, nesuteikdami garantijos ar aprašymo apie galutinę būseną.
Imperatyvaus elemento pavyzdys:
- pavadinimas: Užtikrinti, kad paslauga veiktų
systemd:
pavadinimas: my_service
būsena: pradėta
registruoti: paslaugos_būklė
- pavadinimas: Perkrauti paslaugą, jei ji pradėta
komanda: systemctl restart my_service
when: paslaugos_būklė.changed
Čia antra užduotis vykdoma tik jei pirmoji užduotis pakeitė paslaugos būseną (pavyzdžiui, ją paleido). Tai imperatyvus sąlyga, priklausanti nuo ankstesnio veiksmo rezultato.
Apskritai, Ansible siūlo lankstų požiūrį: jis siekia būti kuo deklaratyvesnis, tačiau leidžia naudoti imperatyvias struktūras ten, kur tai yra logiškai būtina ir valdymo konfigūracijai.