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ı kurDöngü “üç task” gibi çalışır; her iterasyonda
itemobjesi değişir.whensatı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') != -1result.stdoutkomutun çıktısıdır.find()döndürdüğü indeks-1değ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?