Sobes.tech
Middle+

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:

  1. 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.
  2. register ir changed_when naudojimas: 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.
  3. Komandų vykdymo moduliai: command, shell, script moduliai 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.