Sobes.tech
Middle+

Miért nem használhatjuk teljes mértékben a deklaratív megközelítést az Ansible összes playbookjában?

sobes.tech MI

Válasz az MI-től

Az Ansible deklaratív törekvése, hogy a rendszer kívánt állapotát írja le. Azonban a teljes deklarativitás korlátozott, mivel szükség van műveletsorozatok végrehajtására és a feladatok közötti függőségek kezelésére, ami néha imperatív megközelítést igényel a végső állapot helyes eléréséhez. Egyes modulok vagy feladatok meghatározott sorrendben történő végrehajtást vagy az előző feladatok kimenetétől való függést igényelhetnek.

Például:

  1. Feltételes feladatvégrehajtás: A when: használata csak bizonyos feltételek mellett hajt végre feladatot, ami megsértheti a deklarativitás tisztaságát, mivel a feltétel gyakran a jelenlegi (és nem a kívánt végső) állapotra vagy az előző feladat eredményére alapul.
  2. A register és changed_when használata: A feladat kimenetének változóba mentése (register) és ennek felhasználása későbbi feladatokban vagy a változás meghatározására (changed_when) szintén imperatív elem.
  3. Parancsokat végrehajtó modulok: Az olyan modulok, mint a command, shell, script alapvetően imperatívak, mivel egyszerűen végrehajtják a megadott parancsot, anélkül, hogy garantálnák vagy leírnák a végső állapotot.

Imperatív elem példája:

- name: Győződjön meg róla, hogy a szolgáltatás fut
  systemd:
    name: my_service
    state: started
  register: service_status

- name: Indítsa újra a szolgáltatást, ha fut
  command: systemctl restart my_service
  when: service_status.changed

Ebben az esetben a második feladat csak akkor hajtódik végre, ha az első megváltoztatta a szolgáltatás állapotát (például elindította). Ez egy imperatív feltétel, amely a korábbi művelet eredményétől függ.

Általánosságban az Ansible hibrid megközelítést kínál: igyekszik minél deklaratívabb lenni, de hagy teret (néha szükséges) az imperatív szerkezetek használatának ott, ahol a telepítési és konfigurációkezelési logika megkívánja.