Sobes.tech
Middle+

Prečo v Ansible nemôžeme plne využiť deklaratívny prístup vo všetkých playbookoch?

sobes.tech AI

Odpoveď od AI

Ansible sa cieľom deklaratívnosti opisuje željeno stanje systému. Avšak úplná deklaratívnosť je obmedzená kvôli potrebe vykonávať sekvenciu operácií a závislostí medzi úlohami, čo niekedy vyžaduje imperatívny prístup na správne dosiahnutie konečného stavu. Niektoré moduly alebo úlohy môžu vyžadovať vykonanie akcií v určitej poradí alebo závisieť od výstupu predchádzajúcich úloh.

Napríklad:

  1. Podmienečné vykonávanie úloh: Použitie when: na vykonanie úlohy iba za určitých podmienok môže narušiť čistotu deklaratívnosti, pretože podmienka je často založená na aktuálnom (a nie požadovanom konečnom) stave alebo výsledku predchádzajúcej úlohy.
  2. Použitie register a changed_when: Uloženie výstupu úlohy do premennej (register) a použitie tohto výstupu v neskorších úlohách alebo na určenie, či došlo k zmene (changed_when) je tiež imperatívny prvok.
  3. Moduly, ktoré vykonávajú príkazy: Moduly ako command, shell, script sú svojou podstatou imperatívne, pretože jednoducho vykonávajú daný príkaz bez záruky alebo opisu konečného stavu.

Príklad imperatívneho prvku:

- name: Uistite sa, že služba beží
  systemd:
    name: my_service
    state: started
  register: service_status

- name: Reštartujte službu, ak beží
  command: systemctl restart my_service
  when: service_status.changed

Tu sa druhá úloha vykoná iba v prípade, že prvá zmenila stav služby (napríklad ju spustila). Ide o imperatívnu podmienku závislú od výsledku predchádzajúcej akcie.

Celkovo Ansible ponúka hybridný prístup: snaží sa byť čo najviac deklaratívny, ale ponecháva priestor (niekedy nevyhnutný) na použitie imperatívnych konštrukcií tam, kde to logika nasadenia a správy konfigurácie vyžaduje.