Use conditionals to control play execution
1. “when” anahtar sözcüğü
Ansible’da bir task yalnızca belli bir şart sağlanıyorsa çalışsın istiyorsan:
when: <şart>
Şart kısmı Jinja2 ifadesidir ve True dönerse task çalışır.
2. Birden fazla Linux dağıtımı için tek playbook
Problem
Debian tabanlı makinelerde apt
, Red Hat tabanlılarda yum
kullanman gerekiyor.
İki ayrı playbook yerine tek dosyada halletmek için built-in fact’lerden yararlanırız:
ansible_os_family
"Debian"
, "RedHat"
ansible_distribution_version
"20.04"
, "9"
Çözüm
- name: Install NGINX
hosts: all
tasks:
- name: Install NGINX on Debian
apt:
name: nginx
state: present
when: ansible_os_family == "Debian"
- name: Install NGINX on Red Hat
yum:
name: nginx
state: present
when: ansible_os_family == "RedHat"
🔑 Çift eşittir (
==
) ile karşılaştırmayı unutma.
3. Koşulları birleştirmek (and / or)
when: ansible_os_family == "Debian" and ansible_distribution_version == "16.04"
when: ansible_os_family == "RedHat" or ansible_os_family == "SUSE"
and
→ ikisi de doğru olmalıor
→ herhangi biri doğruysa yeter
4. Döngülerde koşul (loop + when)
Elinde kurman gereken paket listesi olsun:
vars:
packages:
- { name: nginx, required: true }
- { name: mysql, required: true }
- { name: apache, required: false }
Task:
- name: Install "{{ item.name }}"
apt:
name: "{{ item.name }}"
state: present
loop: "{{ packages }}"
when: item.required == true # Sadece gerekli olanları kur
Döngü “üç task” gibi çalışır; her iterasyonda
item
objesi değişir.when
satırı her item için ayrı değerlendirildiği için apache es geçilir.
5. Önceki task’ın çıktısına göre karar (register)
register ile sonucu sakla
Sonraki task’ta o değişkeni incele
- name: Check status of httpd
command: service httpd status
register: result
- name: Send alert e-mail if httpd is down
mail:
to: [email protected]
subject: Service Alert
body: Httpd service is down
when: result.stdout.find('down') != -1
result.stdout
komutun çıktısıdır.find()
döndürdüğü indeks-1
değilse “down” kelimesi geçiyor demektir → mail at.
6. Küçük ipuçları
ansible_facts
çıktısını görmek için ansible -m setup
veya playbook içinde debug: var=ansible_facts
Koşul yazmadan önce hangi fact’ler geldiğini gör.
Birden çok “when” satırı yazmak yerine Jinja2’de parantez kullan
Karmaşık koşulları okunur kılar.
Boole karşılaştırırken true/false
küçük harf
YAML boolean’ı.
Fact caching aç (gather_facts: yes
+ cache plugin)
Büyük envanterde performans kazanırsın.
when
anahtar sözcüğü sayesinde tek playbook’la farklı dağıtımları, farklı durumları yönetebiliyorsun. Loops + conditionals + registered vars kombinasyonu da seni “if-else hell”’inden kurtarıp idempotent ve temiz otomasyon sağlar.
Last updated
Was this helpful?