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:

İş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.