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.

Ö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.
Ö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.
Ö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:
Ö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:
Yazının orijinalini buradan okuyabilirsiniz.