Ansible: Uzun Süreli Görevler Nasıl Yönetilir?

Ansible’da uzun süren görevleri yönetmek zor olabilir çünkü Ansible görevlerin belirli bir süre içinde tamamlanmasını bekler ve aksi takdirde zaman aşımına uğrayabilir.

Uzun süren görevleri özellikle ele almak istemenizin iki temel nedeni vardır:

  • Connection Timeouts: Varsayılan olarak Ansible, uzak makinelere olan bağlantıları, o makinede çalışan görev tamamlanana kadar açık tutar. Bir görev, yapılandırılan SSH zaman aşımından daha uzun sürerse, bağlantı kesilir ve oyun kitabı başarısız olur.
  • Parallelization and Efficiency: Ansible genellikle görevleri eş zamanlı olarak, birbiri ardına çalıştırır. Bir görev uzun sürerse, sonraki tüm görevler tamamlanana kadar beklemek zorunda kalır ve bu da verimsiz olabilir. İşlerin aksamaması için uzun süren görevleri diğer görevlerle eş zamanlı veya arka planda çalıştırmak isteyebilirsiniz.

Bu eğitim, uzun süren görevleri etkili bir şekilde halletmeniz için en iyi uygulamaları ve yöntemleri size gösterecektir.

Ansible’da Zaman Aşımlarını Anlama

Ansible, görevlerin tamamlanmasını ne kadar süre bekleyeceğini yönetmek için farklı zaman aşımı ayarları kullanır. Ansible’ın uzun süren görevleri erken başarısızlığa uğratmadan sorunsuz bir şekilde işlemesini sağlamak için zaman aşımı ayarlarını kullanabilirsiniz.

Düzenli Komutlar: ansible_command_timeout veya command_timeout

ansible_command_timeout veya command_timeout ayarı, Ansible’ın bir komutun tamamlanmasını bekleyeceği maksimum süreyi (saniye cinsinden) belirtir.

İşte bir örnek:

- name: Run a long-running command
  command: your_command
  vars:
    ansible_command_timeout: 3600  # 1 hour

Bu örnekte your_command komutunun Ansible tarafından zaman aşımı olarak değerlendirilmesinden önce 1 saate kadar çalışmasına izin verilir.

SSH Üzerinden Komutlar: ansible_ssh_timeout

SSH üzerinden komut çalıştırırken farklı bir zaman aşımı ayarıyla karşılaşabilirsiniz. ansible_ssh_timeout ayarı, Ansible’ın bir SSH bağlantısının kurulmasını veya bir SSH komutunun tamamlanmasını bekleyeceği maksimum süreyi (saniye cinsinden) tanımlar.

İşte bir örnek:

- name: Execute command over SSH
  command: your_command
  vars:
    ansible_ssh_timeout: 7200  # 2 hours

Bu örnekte, SSH bağlantısı ve komut yürütmeye zaman aşımına uğramadan önce 2 saate kadar izin verilmektedir.

Oyun Kitaplarında Zaman Aşımlarını Uygulama

Uzun süren görevleri verimli bir şekilde yönetmek için zaman aşımı ayarlarını doğrudan oyun kitaplarınızın içine uygulayabilirsiniz.

Bu bölümde bu ayarların pratik senaryolarda nasıl kullanılacağı gösterilecektir.

İşte ansible_command_timeout’u kullanan bir örnek oyun kitabı:

---
- name: Example playbook for long-running tasks
  hosts: all
  vars:
    ansible_command_timeout: 3600  # Set command timeout to 1 hour
  tasks:
    - name: Run a long-running command
      command: "dd if=/dev/zero of=/mnt/test.img bs=2M count=2000"

Yukarıdaki playbook, komutlar için 1 saatlik bir zaman aşımı süresi belirler. Bu, playbook tarafından çalıştırılan herhangi bir komutun zaman aşımına uğramadan önce 1 saate kadar çalışmasına izin verileceği anlamına gelir. Playbook, /mnt dizininde büyük bir dosya (test.IMG) oluşturmak için bir komut çalıştıran ve dosya belirtilen boyuta ulaşana kadar 2 megabaytlık bloklar halinde veri yazan bir görev içerir.

Yukarıdaki playbook Ansible kullanarak çalıştırın:

ansible-playbook playbook.yml

Aşağıdaki çıktıyı göreceksiniz:

Handle long running task using ansible_command_timeout

İşte ansible_ssh_timeout’u kullanan bir örnek oyun kitabı:

---
- name: Example playbook for SSH timeouts
  hosts: all
  vars:
    ansible_ssh_timeout: 7200  # Set SSH timeout to 2 hours
  tasks:
    - name: Execute a command over SSH
      command: "dd if=/dev/zero of=/mnt/test.img bs=2M count=2000"

Yukarıdaki kılavuz, belirtilen tüm ana bilgisayarlarda çalışır ve SSH zaman aşımını 2 saate ayarlar. Bu, SSH bağlantısının zaman aşımına uğramadan 2 saate kadar açık kalacağı anlamına gelir. Kılavuz, /mnt dizininde test.img adında büyük bir dosya oluşturmak için SSH üzerinden bir komut çalıştıran ve dosya belirtilen boyuta ulaşana kadar 2 megabaytlık bloklar halinde veri yazan bir görev içerir.

Hadi bu playbooku çalıştıralım:

ansible-playbook playbook.yml

Aşağıdaki çıktıyı göreceksiniz:

Zaman Aşımı Ayarlarını Birleştirme

Bazı durumlarda, hem komut yürütmeyi hem de SSH bağlantılarını içeren görevleri işlemek için hem ansible_command_timeout hem de ansible_ssh_timeout’u birleştirmeniz gerekebilir.

İşte her iki ayarı birleştiren bir örnek oyun kitabı:

---
- name: Playbook combining command and SSH timeouts
  hosts: all
  vars:
    ansible_command_timeout: 3600  # 1 hour for command execution
    ansible_ssh_timeout: 7200      # 2 hours for SSH operations
  tasks:
    - name: Run a long-running command with SSH
      command: "dd if=/dev/zero of=/mnt/test.img bs=2M count=2000"

Uzun Süreli Görevleri Yönetmek İçin Eşzamansız Eylemleri Kullanın

Ansible, görevlerin arka planda çalışmasına ve diğer görevlerle devam etmesine veya tamamlanmasını beklemesine olanak tanıyan eşzamansız görev yürütmeyi destekler. Bu, async ve poll anahtar sözcükleri kullanılarak gerçekleştirilir.

async, saniye cinsinden maksimum çalışma süresini belirtir.
poll, görevin durumunun ne sıklıkla kontrol edileceğini belirler.

İşte bir örnek playbook:

---
- name: Run long-running task asynchronously
  hosts: all
  tasks:
    - name: Start a long-running task
      command: "dd if=/dev/zero of=/mnt/test.img bs=15M count=2000"
      async: 7200  # Run for up to 2 hours
      poll: 0      # Do not wait for the task to complete
      register: long_running_task
      ignore_errors: true  # Ensure playbook continues even if task fails

    - name: Check on the long-running task
      async_status:
        jid: "{{ long_running_task.ansible_job_id }}"
      register: job_result
      until: job_result.finished
      retries: 360
      delay: 30

Bu Ansible playbook, tüm ana bilgisayarlarda eşzamansız olarak uzun süreli bir görev gerçekleştirir. /mnt dizininde büyük bir dosya olan test.img dosyasını oluşturmak için bir komut çalıştırarak başlar. Bu dosya, playbook yürütme anketini engellemeden 2 saate kadar çalışabilir: 0. Görev kaydedilir ve hatalar yok sayılır, böylece playbook başarılı veya başarısız olsun devam eder. Ardından, tamamlanana kadar görevin durumunu her 30 saniyede bir (en fazla 360 yeniden deneme) kontrol eder.

Yukarıdaki playbooku şu şekilde çalıştırın:

ansible-playbook playbook.yml

Aşağıdaki çıktıyı göreceksiniz:

 

 

Yazının orijinalini buradan okuyabilirisniz.

Hüseyin GÜÇ

Kariyerime 26 yıl önce başladım. Windows ve Linux sistemlerinin kurulumu, yapılandırılması, yönetimi ve bakımı dahil olmak üzere birden fazla sistem üzerinde uzmanlaştım. Açık kaynak dünyasındaki en son gelişmelerden haberdar olmaktan ve Linux hakkındaki en son araçları, özellikleri ve hizmetleri denemekten hoşlanıyorum. Son 6 yıldır  sistem ve ağ yöneticisi olarak görev yapıyorum ayrıca Pardus Dönüşüm Projesini yönetiyorum ve Pardus İşletim Sisteminin yaygınlaşması adına uğraş gösteriyorum. Boş zamanlarımda açık kaynaklı uygulamaların Türkçe çevirisine katılıyorum ve The Document Foundation üyesiyim.