Sobes.tech
Middle+

Ansible'da neden tüm playbook'larda tamamen deklaratif yaklaşımı kullanamıyoruz?

sobes.tech yapay zeka

AI'dan gelen yanıt

Ansible, istenilen sistem durumunu tanımlayarak deklaratif olmayı amaçlar. Ancak, tam deklaratiflik, görevler arasındaki bağımlılıkları ve işlemleri gerçekleştirme gerekliliği nedeniyle sınırlıdır; bu bazen doğru son duruma ulaşmak için zorunlu olan imperatif bir yaklaşım gerektirir. Bazı modüller veya görevler, belirli bir sırayla işlem yapmayı veya önceki görevlerin çıktısına bağlı olmayı gerektirebilir.

Örneğin:

  1. Koşullu görev yürütme: when: kullanımı, belirli koşullar altında görevi yürütmek, saf deklaratifliği bozabilir çünkü koşul genellikle mevcut duruma (veya istenen son duruma değil) veya önceki görevin sonucuna dayanır.
  2. register ve changed_when kullanımı: Bir görevin çıktısını bir değişkende saklamak (register) ve bu çıktıyı sonraki görevlerde veya değişiklik olup olmadığını belirlemede kullanmak da imperatif bir unsurdur.
  3. Komut çalıştıran modüller: command, shell, script gibi modüller doğası gereği imperatif olup, sadece belirli bir komutu çalıştırır ve son durumu garanti etmez veya tanımlamaz.

İşte bir imperatif unsur örneği:

- name: Hizmetin çalıştığından emin ol
  systemd:
    name: my_service
    state: started
  register: service_status

- name: Hizmeti yeniden başlat eğer çalışıyorsa
  command: systemctl restart my_service
  when: service_status.changed

Burada, ikinci görev yalnızca ilk görev hizmetin durumunu değiştirdiyse çalışır (örneğin, başlattıysa). Bu, önceki eylemin sonucuna bağlı imperatif bir koşuldur.

Genel olarak, Ansible hibrit bir yaklaşım sunar: mümkün olan en deklaratif olmayı amaçlar, ancak dağıtım ve yapılandırma yönetimi mantığı gerektirdiğinde bazen gerekli olan imperatif yapılar için alan bırakır.