Ansible: when İşlevini Kullanma 

Ansible’da when ifadesi, belirli koşullara dayalı görevleri koşullu olarak yürütür. playbooklarda yürütme akışını değişkenlerin değerlerine, gerçeklere veya önceki görevlerin sonuçlarına göre kontrol etmenizi sağlar.

Ansible, ne zaman kullanabileceğiniz çeşitli koşul türlerini destekler:

  • Boolean values: Basit koşullar için doğrudan doğru veya yanlış kullanabilirsiniz.
  • Variables: Görev yürütülmesini denetlemek için kayıt defterinizde veya envanter dosyalarınızda tanımlanan değişkenleri kullanabilirsiniz.
  • Facts: Ansible’ın yürütülmesi sırasında toplanan gerçeklere ansible_facts veya belirli gerçek adlarını kullanarak erişebilirsiniz. Örneğin: ansıble_os_famıly == “Debian” işletim sisteminin Debian ailesine ait olup olmadığını kontrol eder. Görevleri koşullu olarak yürütmek için bu gerçekleri kullanabilirsiniz.
  • Jinja2 Expressions: Değişken değerlere, matematiksel işlemlere, dize karşılaştırmalarına vb. Dayalı karmaşık koşulları değerlendirmek için Jinja2 ifadelerini kullanabilirsiniz.
  • Registered Variables: Sonraki görevlerin yürütülüp yürütülmeyeceğini belirlemek için önceki görevlerin sonuçlarını (kayıtlı değişkenlerde saklanır) kullanabilirsiniz.

Bu yazıda, pratik örnekler kullanırken Ansible’ın nasıl kullanılacağını açıklayacağım.

Ansible olduğunda temel sözdizimi

İşte Ansible’da nasıl kullanılacağına dair temel bir sözdizimi:

- name: Task Name
  <module_name>:
    <module_options>
  when: <condition>

Bu sözdiziminde:

  • name: Görev için açıklayıcı bir ad.
  • module_name: Yürütmek istediğiniz Ansible modülü.
  • module_options: Modüle özgü tüm seçenekler veya parametreler.
  • condition: Görevin yürütülmesi gereken koşul. Genellikle doğru veya yanlış olarak değerlendiren bir ifade olarak yazılır.

Örnek 1: Bir döngü ve koşullu olduğunda Ansible kullanın

Hedef sistemde algılanan paket yöneticisini temel alarak Apache web sunucusunu kurmak için Ansible when deyimini döngü ve koşullarla kullanabilirsiniz. İşte paket yöneticisine dayalı olarak Apache veya httpd’nin nasıl kurulacağını gösteren örnek bir playbook:

---
- name: Install Apache or HTTPd based on package manager
  hosts: all
  become: true
  tasks:
    - name: Determine package manager
      set_fact:
        apache_pkg:
          - "{{ 'apache2' if ansible_pkg_mgr == 'apt' else 'httpd' }}"
      when: ansible_pkg_mgr == 'apt' or ansible_pkg_mgr == 'dnf' or ansible_pkg_mgr == 'yum'

    - name: Install Apache or HTTPd
      ansible.builtin.package:
        name: "{{ apache_pkg }}"
        state: present
      ignore_errors: yes

    - name: Print error message if no suitable package manager found
      debug:
        msg: "No suitable package manager found to install Apache or HTTPd."
      when: apache_pkg is undefined

Bu Ansible playbook, hedef sistemde bulunan paket yöneticisine dayalı olarak Apache veya httpd’yi kurmak için tasarlanmıştır. Playbookun her bir bölümünü parçalayalım:

  • Paket yöneticisini belirleme: Bu görev, algılanan paket yöneticisine (ansıble_pkg_mgr) dayalı olarak Apache veya HTTPd için uygun paket adını belirlemek üzere set_fact modülünü kullanır. Paket yöneticisi uygunsa, apache_pkg öğesini apache2 olarak ayarlar; aksi takdirde httpd olarak ayarlar. Bu görev, paket yöneticisinin apt, dnf veya yum’dan biri olması koşulludur (ne zaman).
  • Apache veya Httpd’yi yükleyin: Bu görev ansible’ı kullanır.yerleşik.paket modülü belirtilen paketi yüklemek için apache_pkg. Paketin yüklenmesi gerektiğini belirten durumu sunacak şekilde ayarlar. Ignore_errors: yes yönergesi, paket yüklemesi başarısız olsa bile yürütmeye devam etmek için kullanılır.
  • Uygun bir paket yöneticisi bulunamadıysa hata mesajı yazdırın: Bu görev, apache_pkg tanımlanmamışsa, Apache veya httpd’yi yüklemek için uygun bir paket yöneticisinin algılanmadığını belirten bir hata ayıklama iletisi yazdırır.

Şimdi playbooku çalıştırın.

ansible-playbook playbook.yml

Aşağıdaki ekran görüntüsünü göreceksiniz.

Install web server based on package manager using when in Ansible

Örnek 2: Bir döngü olduğunda Ansible kullanın

Belirtilen koşullara göre farklı kullanıcılar için dizinler oluşturmak için Ansible when deyimini bir döngü ile kullanmanın bir örneği:

- name: Create directories for specific users
  hosts: node1
  tasks:
    - name: Create directories for multiple users
      ansible.builtin.file:
        path: "/home/{{ item }}/data"
        state: directory
      when: item != 'admin'   # Create directories for all users except 'admin'
      loop:
        - user1
        - user2
        - user3
        - admin

Bu örnekte, görev birden çok kullanıcı için dizinler oluşturur, ancak döngü ile when koşulunu kullanarak kullanıcı yöneticisi için dizin oluşturmayı atlar.

Şimdi playbooku çalıştırın.

ansible-playbook playbook.yml

You will see the following screenshot.

Create directories for specific users

 

Örnek 3: Bir komutu yalnızca bir dosya varsa çalıştırın

Bu örnekte, varsa uzaktaki bir dosyanın içeriğini yazdıran ve içeriğini görüntülemeden önce dosyayı yerel bir dizine getiren bir playbook oluşturacağız.

---
- name: Print content of remote file if it exists
  hosts: node3
  tasks:
    - name: Check if the file exists
      ansible.builtin.stat:
        path: /etc/file
      register: file_stat

    - name: Print content of the file if it exists
      ansible.builtin.fetch:
        src: /etc/file
        dest: /tmp/file
        flat: yes
      when: file_stat.stat.exists

    - name: Display content of the file
      debug:
        msg: "File content: {{ lookup('file', '/tmp/file') }}"
      when: file_stat.stat.exists

Hadi playbooku açıklayalım:

  • Oynatma kitabı, node3 ana bilgisayarını hedefler.
  • İlk görev, hedef düğümde /etc/dosyasının var olup olmadığını kontrol etmek için stat modülünü kullanır. Sonuç file_stat değişkenine kaydedilir.
  • İkinci görev, /etc/dosyasını uzak ana bilgisayardan /tmp/file yerel dizinine getirmek için getirme modülünü kullanır. Flat: evet seçeneği, dosyanın herhangi bir dizin yapısı olmadan getirilmesini sağlar. Bu görev yalnızca dosya hedef düğümde varsa çalışır (ne zaman: file_stat.durum.var).
  • Üçüncü görev, yerel dizine getirilen dosyanın içeriğini görüntülemek için hata ayıklama modülünü kullanır. Bu görev, yalnızca dosya hedef düğümde varsa da çalışır (ne zaman: file_stat.durum.var).

Oyun kitabını çalıştırmak için aşağıdaki komutu kullanın.

ansible-playbook playbook.yml

Aşağıdaki ekran görüntüsünü göreceksiniz.

Run a command if file exists

Örnek 4: Değerlerle Ansible kullanımı

Bu playbookta, hedef sistemlerin dağıtımına ve ana sürümüne bağlı olarak görevleri seçici olarak yürütmek için Olası gerçeklere dayandığında koşullu ifadelerin kullanımını göstereceğiz.

---
- name: Ansible When with facts example
  hosts: all
  become: true
  tasks:

    - name: Display distribution and major version
      debug:
        msg: "Distribution: {{ ansible_facts['distribution'] }}, Major Version: {{ ansible_facts['distribution_major_version'] }}"


    - name: Shutdown the remote node if distribution is Ubuntu with a major Version 22.04 
      ansible.builtin.command: /sbin/shutdown -t now
      when: ansible_facts['distribution'] == 'Ubuntu' and ansible_facts['distribution_major_version'] == '22'

    - name: Shutdown the remote node if distribution is RedHat 
      ansible.builtin.command: /sbin/shutdown -t now
      when: ansible_facts['os_family'] == "RedHat"

Bu playbook, hedef sistemlerin dağıtımını ve ana sürümünü yazdırır ve ardından algılanan dağıtım ve işletim sistemi ailesine bağlı olarak uzak düğümü seçici olarak kapatır.

Playbookun her bir bölümünü açıklayalım:

  • Display distribution and major version: Bu görev, hedef sistemlerin dağıtımını ve ana sürümünü görüntülemek için hata ayıklama modülünü kullanır. Bu gerçeklere erişmek için ansıble_facts[‘distribution’] ve ansıble_facts[‘distribution_major_version’] kullanır.
  • Shutdown the remote node if the distribution is Ubuntu with a major Version 22.04: Bu görev ansible’ı kullanır.yerleşik.dağıtım Ubuntu ve ana sürüm 22.04 ise/sbin / shutdown-t now komutunu çalıştırmak için komut modülü. When koşulu, ansıble_facts[‘distribution’] öğesinin Ubuntu’ya eşit olup olmadığını ve ansıble_facts[‘distribution_major_version’] öğesinin 22’ye eşit olup olmadığını denetler.
  • Shutdown the remote node if distribution is RedHat:     Önceki göreve benzer şekilde, hedef sistemin işletim sistemi ailesi RedHat ise bu görev /sbin/shutdown-t now komutunu çalıştırır. Bu durumu kullanarak denetler ansıble_facts [‘os_famıly’].
    Şimdi, yukarıdaki playbooku çalıştırın.
ansible-playbook playbook.yml

Aşağıdaki ekran görüntüsünü göreceksiniz:

Executing command based on the operating system

Örnek 5: Kayıtlı değerlere göre Ansible kullanma

Ansible’ın when yan tümcesi, önceki görevlerin çıktısına dayalı olarak görevleri koşullu olarak yürütmenize olanak tanır.

Bu playbook’ta, uzak bir dizinin boş olup olmadığını kontrol etmek için Ansible’daki stat modülünü when koşuluyla birlikte kullanabilirsiniz. Uzak bir dizinin boş olup olmadığını kontrol etmek için kayıtlı değerlerle nasıl kullanılacağı aşağıda açıklanmıştır:

---
- name: Check the empty directory
  hosts: node3
  tasks:
    - name: Get directory stats
      stat:
        path: /opt
      register: dir_info

    - name: Find files in a directory
      find:
        paths: /opt
        file_type: file
        hidden: true
      register: files_found

    - name: Fail if directory not empty
      fail:
        msg: "Directory /opt is not empty."
      when: dir_info.stat.exists and files_found.matched > 0

    - name: Debug message if directory is empty
      debug:
        msg: "Directory /opt is empty."
      when: dir_info.stat.exists and files_found.matched == 0

Bu örnekte:

  • İlk görev, varlığı da dahil olmak üzere dizin hakkında bilgi almak için stat kullanır. Sonucu dir_info olarak saklar.
  • İkinci görev, dizindeki tüm dosyaları (gizli olanlar dahil) aramak için bul’u kullanır. Eşleşme sayısını files_found.matched’de saklar.
  • Başarısız görevi yalnızca dizin varsa (dir_info.stat.exists True ise) ve dosyalar bulunduysa (files_found.matched 0’dan büyükse) tetiklenir. Bu, boş olmayan bir dizini gösterir.
  • Hata ayıklama görevi, dizin boşsa bir ileti yazdırır (hem varlık denetimi hem de dosya bulunamadı).

Bu oyun kitabını çalıştıralım:

ansible-playbook playbook.yml

Aşağıdaki ekran görüntüsünü göreceksiniz:

Checking empty directory

 

Yazının orijinalini  buradan okuyabilirsiniz.

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.