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:
- 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. - A
registeréschanged_whenhaszná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. - Parancsokat végrehajtó modulok: Az olyan modulok, mint a
command,shell,scriptalapvető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.