Sobes.tech
Middle+

Ansible-də niyə bütün playbooklarda tamamilə deklarativ yanaşmadan istifadə edə bilmirik?

sobes.tech Süni İntellekt

AI-dan cavab

Ansible sistemin arzu olunan vəziyyətini təsvir etməklə deklarativliyə nail olmağa çalışır. Ancaq, tam deklarativlik məhduddur, çünki ardıcıl əməliyyatların və tapşırıqlar arasındakı asılılıqların yerinə yetirilməsi zərurəti var ki, bu da bəzən düzgün son vəziyyətə çatmaq üçün imperativ yanaşmanı tələb edir. Bəzi modullar və ya tapşırıqlar müəyyən bir ardıcıllıqla əməliyyatlar aparmağı və ya əvvəlki tapşırıqların çıxışına bağlı olmağı tələb edə bilər.

Məsələn:

  1. Şərti tapşırıqların yerinə yetirilməsi: when: istifadə edərək, yalnız müəyyən şərtlər altında tapşırığın yerinə yetirilməsi, saf deklarativliyi poza bilər, çünki şərt çox vaxt mövcud vəziyyətə (və ya arzu olunan son vəziyyətə deyil) və ya əvvəlki tapşırığın nəticəsinə əsaslanır.
  2. registerchanged_when istifadə edilməsi: Tapşırığın nəticəsini dəyişənə qeyd etmək (register) və bu nəticədən istifadə edərək sonrakı tapşırıqları və ya dəyişiklik olub-olmadığını müəyyən etmək (changed_when) də imperativ elementdir.
  3. Əmrləri yerinə yetirən modullar: command, shell, script kimi modullar təbiətcə imperativdir, çünki onlar sadəcə verilmiş əmri yerinə yetirir və son vəziyyəti təmin etmir və ya təsvir etmir.

İmperativ element nümunəsi:

- name: Xidmətin işlək vəziyyətdə olmasını təmin et
  systemd:
    name: my_service
    state: started
  register: service_status

- name: Xidməti yenidən başlat, əgər işlək vəziyyətdədirsə
  command: systemctl restart my_service
  when: service_status.changed

Burada, ikinci tapşırıq yalnız birinci tapşırıq xidməti dəyişdirdikdə (məsələn, işə salındıqda) yerinə yetirilir. Bu, əvvəlki əməliyyatın nəticəsinə bağlı imperativ şərtdir.

Ümumilikdə, Ansible hibrid yanaşma təklif edir: mümkün qədər deklarativ olmağa çalışır, lakin yerləşdirmə və konfiqurasiya idarəetmə məntiqi tələb etdikdə imperativ quruluşlara yer ayırır.