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:
- Şə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. registervəchanged_whenistifadə 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.- Əmrləri yerinə yetirən modullar:
command,shell,scriptkimi 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.