Ansible Conditionals
1. Neden Koşullar Gerekli?
Diyelim ki:
Debian tabanlı (Ubuntu gibi) sunucularda paketleri apt ile,
RedHat tabanlı (CentOS gibi) sunucularda paketleri yum ile
kurmanız gerekiyor. Normalde iki ayrı playbook yazılabilir: biri Debian için, biri RedHat için. Ancak koşullar (conditionals) kullanarak tek bir playbook içinde hangi görevlerin hangi OS üzerinde çalışacağını belirleyebilirsiniz.
2. when (Clause) ile Koşullu Görevler
when (Clause) ile Koşullu Görevler2.1 Örnek: Farklı OS Aileleri
- name: Install Nginx on multiple OS families
hosts: all
tasks:
- name: Install Nginx on Debian
apt:
name: nginx
state: present
when: ansible_os_family == "Debian" and ansible_distribution_version == "16.04"
- name: Install Nginx on RedHat or SUSE
yum:
name: nginx
state: present
when: ansible_os_family == "RedHat" or ansible_os_family == "SUSE"ansible_os_familyveansible_distribution_version, Ansible Facts tarafından sağlanan hazır değişkenlerdir. (Örn. “Debian”, “RedHat”, “SUSE”)when: ansible_os_family == "Debian"diyerek, sadece OS “Debian” olan makinelerde bu görevi çalıştırır.and,orgibi mantıksal operatörlerle daha karmaşık koşullar kurabilirsiniz.
2.2 Dikkat Noktaları
Eşitlik Kontrolü:
==kullanmalısınız (tek=değil).Facts’ın Toplanması: Bu değişkenlerin (
ansible_os_familyvb.) hazır olması için “Gather Facts” açık olmalı veya OS bilgisi bir şekilde envanterden gelmelidir.
3. Döngülerde (Loops) Koşullar Kullanmak
Bazen bir liste (ör. packages) içindeki öğeleri sırayla kurmanız, ancak içlerinden sadece “gerekli” olanları yüklemek istersiniz. Bunun için de when:i döngü (loop:) içinde kullanabilirsiniz.
Örnek:
- name: Install software packages
hosts: all
vars:
packages:
- name: nginx
required: true
- name: mysql
required: true
- name: apache
required: false
tasks:
- name: Install "{{ item.name }}"
apt:
name: "{{ item.name }}"
state: present
loop: "{{ packages }}"
when: item.requiredloop: "{{ packages }}": Üç öğeyi (nginx, mysql, apache) sırayla işler.when: item.required:required == trueolan paketlerde görevi çalıştırır,falseolanı geçer.Böylece “apache”
required: falseolduğu için yüklenmez.
4. Önceki Görev Çıktısına Göre Koşullar
Ansible’da bir görevdeki çıktıyı (output) register: sonuc ile saklayıp sonraki görevde when: ... kullanarak karar verebilirsiniz.
Örnek: Servis Durumunu Kontrol Etmek
- name: Check service status and send alert
hosts: localhost
tasks:
- name: Check status of httpd service
command: service httpd status
register: result
- name: Send email alert if httpd service is down
mail:
to: [email protected]
subject: "Service Alert"
body: "Httpd Service is down"
when: result.stdout.find('down') != -1İlk görev
service httpd statusçalıştırıp çıktıyıresultadlı değişkende saklıyor.İkinci görev,
result.stdoutiçindeki metinde'down'kelimesini arıyor (find('down')).find('down')-1döndürmezse, demek ki kelime bulundu → “Servis down” demek, o durumda mail gönderiyor.
Mantık: “Eğer çıktı içinde 'down' varsa, e-posta at.”
5. İpuçları ve Özet
when:cümlesi, bir görevin sadece belli bir koşul doğru (true) olduğunda çalışmasını sağlar.Kullanım Senaryoları:
Farklı OS’lerde farklı modül kullanmak (Debian vs RedHat).
Bir döngüde sadece bazı öğeleri işlemek (örn.
item.required == true).Önceki görevdeki kaydedilen çıktıya göre sonraki görevi koşturmak veya atlamak.
Mantıksal Operatörler:
and,or,==,!=,>vb.String Metotları:
stdout.find('down') != -1gibi Python benzeri ifadeler kullanabilirsiniz.Koşul sağlanmazsa: Görev “SKIPPED” olarak atlanır, playbook durmaz veya hata vermez.
Bu sayede tek bir playbook ile, sistemlerinizin farklı senaryolarına göre dinamik şekilde uygun görevleri çalıştırabilirsiniz. Daha temiz, bakımı kolay ve esnek bir Ansible otomasyonu elde edersiniz.
Last updated
Was this helpful?