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:
- 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. - Použitie
registerachanged_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. - Moduly, ktoré vykonávajú príkazy: Moduly ako
command,shell,scriptsú 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.