Ansible Serisinin 5. Bölümünde, Ansible modüllerini kullanarak Ansible Plays ve Playbook’ların nasıl oluşturulacağını açıklayacağız.
Ansible, uzak bilgisayarlarda özel görevlerin yürütülmesi için çalışma kitaplarında kullanılan modüller adı verilen bağımsız betiklerle birlikte gelir.
Modüller, paket yönetimi, dosyaların arşivlenmesi ve kopyalanması gibi görevleri otomatikleştirmek için kullanışlıdır. Yapılandırma dosyalarında ince ayarlar yapmanıza ve yönlendiriciler, anahtarlar, yük dengeleyiciler, güvenlik duvarları ve bir dizi başka cihaz gibi cihazları yönetmenize olanak tanırlar.
Bu alt konunun amacı, size Ansible modülleri tarafından gerçekleştirilebilecek çeşitli görevler hakkında genel bir bakış sunmaktır:
Linux’ta Paket Yönetimi
Paket yönetimi, sistem yöneticileri tarafından yürütülen en önemli ve sık görevlerden biridir. Ansible, hem RedHat hem de Debian tabanlı sistemlerde paket yönetimi görevlerini yürütmenize yardımcı olan modüllerle birlikte gelir.
Debian tabanlı APT paket yönetimi için apt modülü, YUM paket yönetimi için eski yum modülü ve daha yeni RHEL dağıtımlarıyla ilişkili dnf modülü bulunmaktadır.
Aşağıda, modüllerin bir çalışma kitabında nasıl kullanılabileceğine dair birkaç örnek verilmiştir:
Örnek 1: Apache Web Sunucusunu RHEL 8’e Kurmak
--- - name: install Apache webserver hosts: webservers tasks: - name: install httpd dnf: name: httpd State: latest
Örnek 2: Apache Web Sunucusunu Debian 10’a Kurmak
--- - name: install Apache webserver hosts: databases tasks: - name: install Apache webserver apt: name: apache2 State: latest
Service Modülü
Hizmet modülü, sistem yöneticilerinin sistemdeki hizmetleri başlatmasına, durdurmasına, güncellemesine, yükseltmesine ve yeniden yüklemesine olanak tanır.
Örnek 1: Apache Web Sunucusunu Başlatma
--- - name: Start service httpd, if not started service: name: httpd state: started
Örnek 2: Apache Web Sunucusunu Durdurma
--- - name: Stop service httpd service: name: httpd state: stopped
Örnek 3: Bir Ağ Arayüzünü Yeniden Başlatma
--- - name: Restart network service for interface eth0 service: name: network state: restarted args: enp2s0
Kopyalama Modülü
Adından da anlaşılacağı gibi, kopyalama modülü dosyaları uzak makinedeki bir konumdan aynı makinedeki farklı bir konuma kopyalar.
Örnek 1: Dosyaları Yerelden Uzak Linux’a Kopyalama
--- - name: Copy file with owner and permissions copy: src: /etc/files/tecmint.conf dest: /srv/tecmint.conf owner: tecmint group: tecmint mode: '0644'
Çalışma kitabı, tecmint.conf yapılandırma dosyasını /etc/files/ dizininden /srv/ dizinine tecmint kullanıcısı olarak 0644 izinlerine kopyalar.
İzinler, son satırda gösterildiği gibi sembolik temsil kullanılarak da temsil edilebilir.
Örnek 2: Dosyaları Yerelden Uzak Linux’a Kopyalama
--- - name: Copy file with owner and permissions copy: src: /etc/files/tecmint.conf dest: /srv/tecmint.conf owner: tecmint group: tecmint mode: u=rw, g=r, o=r
Önceki örnekteki izinler, son satırda gösterildiği gibi gösterilebilir. Kullanıcıya okuma ve yazma izinleri, gruba yazma izinleri ve dünyanın geri kalanına okuma izinleri atanır.
File Modülü
Dosya modülü, dosya ve dizin oluşturma, dosya izinlerini atama ve sembolik bağları ayarlama dahil olmak üzere birçok dosya işlemini gerçekleştirmek için kullanılır.
Örnek 1: Linux Dosya İzinlerini Gerçekleştirin
--- - name: Change file ownership, group, and permissions file: path: /etc/tecmint.conf owner: tecmint group: tecmint mode: '0644'
Yukarıdaki oynatma, izinleri 0644 olarak ayarlayan /etc dizininde tecmint.conf adlı bir dosya oluşturur.
Örnek 2: Linux Dosyasını Silme
--- - name: Remove file (delete file) file: path: /etc/tecmint.conf state: absent
Bu, tecmint.conf dosyasını kaldırır veya siler.
Örnek 3: Bir Dizin Oluşturun
--- - name: create a directory if it doesn’t exist file: path: /etc/mydirectory State: directory mode: '0777'
Bu, izinleri 0777 olarak ayarlayan /etc dizini içinde bir dizin yaratacaktır.
Örnek 4: Bir Dizini Yinelemeli Olarak Silme
--- - name: Recursively deleting a directory file: path: /etc/tecmint.conf state: absent
Yukarıdaki komutlar bir dizini yinelemeli olarak siler.
Lineinfile Modülü
Lineinfile modülü, bir dosyadaki tek bir satırı değiştirmek istediğinizde yardımcı olur. Mevcut bir satırın yerini alabilir.
Örnek 1: Linux’ta Dosyaları Yönetin
--- - name: Ensure SELinux is set to enforcing mode lineinfile: path: /etc/selinux/config regexp: '^SELINUX=' line: SELINUX=disabled
Yukarıdaki oyun SELINUX değerini devre dışı olarak ayarlar.
SELINUX=disabled
Örnek 2: Linux’ta Dosyaları Değiştirme
--- - name: Add a line to a file if the file does not exist, without passing regexp lineinfile: path: /etc/hosts line: 10.200.50.51 tecmint.com create: yes
Bu, 10.200.50.51 tecmint.com satırını /etc/hosts dosyasına ekler.
Arşiv Modülü
Bir Arşiv modülü, tek veya birden çok dosyanın sıkıştırılmış bir arşivinin oluşturulması için kullanılır. Sıkıştırma kaynağının hedef hedefte mevcut olduğunu varsayar. Arşivlemeden sonra, kaynak dosya daha sonra remove=True ifadesi kullanılarak silinebilir veya kaldırılabilir.
Örnek 1: Bir Arşiv Dosyası Oluşturma
- name: Compress directory /path/to/tecmint_dir/ into /path/to/tecmint.tgz archive: path: /path/to/tecmint_dir dest: /path/to/tecmint.tgz This compresses the /path/to/tecmint_dir directory to /path/to/tecmint.tgz
Örnek 2: Bir Arşiv Dosyası Oluşturma ve Kaldırma
- name: Compress regular file /path/to/tecmint into /path/to/foo.gz and remove it archive: path: /path/to/tecmint dest: /path/to/tecmint.tgz remove: yes
Yukarıdaki oyunda, arşivleme tamamlandıktan sonra /path/to/tecmint kaynak dosyası silinir.
Örnek 3: Bir Arşiv Dosyası Oluşturun
- name: Create a bz2 archive of /path/to/tecmint archive: path: /path/to/tecmint format: bz2
Bu, /path/to/tecmint dosyasından bz2 biçiminde sıkıştırılmış bir dosya oluşturur.
Git Modülü
Modül, yazılım havuzlarının git kontrollerini yönetir.
Örnek 1: Git Depolarını Kontrol Edin
- git: repo: 'https://foosball.example.org/path/to/repo.git' dest: /srv/checkout version: release-0.22
Command Modülü
En sık kullanılan modüllerden biri olan komut modülü, komut adını alır ve ardından bir argüman listesi gelir. Komut, bir Linux kabuğuna yazdığınız şekilde iletilir.
Example 1: Run a Command
- name: Executing a command using the command module command: cat helloworld.txt
Örnek 2: Uzak Linux’un Çalışma Süresini Kontrol Etme
--- - name: Check the remote host uptime hosts: servers tasks: - name: Execute the Uptime command over Command module register: uptimeoutput command: "uptime" - debug: var: uptimeoutput.stdout_lines
Komut modülü, uzak sunucuların çalışma sürelerini alır.
Çalışan Komutların Sonuçlarını Almak İçin Değişkenler
Genellikle, Ansible çalışma kitapları, çıktıyı komut satırında görüntülemeden yönetilen ana bilgisayarlarda görevleri yürütmek için kullanılır. Bununla birlikte, çıktıyı veya sonuçları yakalamanızın istenebileceği durumlar vardır. Bu bölümde, bir çalışma kitabının çıktısını bir değişkende nasıl yakalayabileceğinizi ve daha sonra nasıl görüntüleyebileceğinizi anlatacağız.
Cevaplayıcı bir kayıt, bir görevin çıktısını yakalamak ve onu bir değişken olarak kaydetmek için kullanılır. Değişken bundan sonra görevin stdout’unu içerecektir.
Örneğin, df -Th / komutunu kullanarak ilgili kök dizinlerdeki yönetilen düğümlerin disk kullanımını kontrol etmek istediğinizi varsayalım. Komutu tanımlamak için ‘command’ modülünü ve std çıktısını bir değişkene kaydetmek için ‘register’ modülünü kullanacaksınız.
Komutu görüntülemek için, stdout dönüş değerinin yanında ‘debug’ modülünü kullanacaksınız.
--- - hosts: all become: yes tasks: - name: Execute /boot usage on Hosts command: 'df -Th /' register: df - debug: var=df.stdout
Şimdi çalışma kitabını çalıştıralım. Bu örnekte çalışma kitabımıza check_disk_space.yml adını verdik.
# ansible-playbook check_disk_space.yml

Gördüğünüz gibi, çıktılar karmakarışık ve takip etmeyi zorlaştırıyor.
Çıktıyı hizalamak ve okumayı kolaylaştırmak için stdout dönüş değerini stdout_lines ile değiştirin.
--- - hosts: all become: yes tasks: - name: Execute /boot usage on Hosts command: 'df -Th /' register: df - debug: var=df.stdout_lines
Oynatmanın Yürütülmesini Kontrol Etmek İçin Koşulları Kullanın
Tıpkı programlama dillerinde olduğu gibi, birden fazla sonucun mümkün olduğu durumlarda koşullu ifadeler kullanılır. Ansible çalışma kitaplarında yaygın olarak kullanılan bazı koşullu ifadelere bir göz atalım.
When ifadesi
Bazen görevleri, belirli bilgisayarlarda gerçekleştirmek isteyebilirsiniz. ‘When’ koşullu ifadesinin kullanımı ve bir çalışma kitabında uygulanması oldukça kolaydır. ‘When’ yan tümcesini kullanırken, yan tümcenin bitişiğindeki koşulu gösterildiği gibi bildirmeniz yeterlidir:
when: condition
Koşul sağlandığında, görev uzak sistemde gerçekleştirilir.
Birkaç örneği inceleyelim:
Örnek 1: When Operatörünün Kullanılması
--- - hosts: all tasks: - name: Install Nginx on Debian apt: name=nginx state=present when: ansible_os_family == “Debian”
Yukarıdaki komutlar, Debian dağıtım ailesini çalıştıran bilgisayarlara Nginx web sunucusunu kurar.
OR ve AND işlecini, when koşullu ifadenin yanında da kullanabilirsiniz.
Örnek 2: AND Operatörünü When ile Kullanmak
--- - hosts: all tasks: - name: Install Nginx on Debian apt: name=nginx state=present when: ansible_os_family == “Debian” and ansible_distribution_version == “18.04”
AND operatörünü kullanırken, görevin yürütülebilmesi için her iki ifadenin de karşılanması gerekir.
Yukarıdaki komutlar, sürüm 18.04 olan bir Debian işletim sistemi ailesini çalıştıran bilgisayarlara Nginx’i yükler. Açıkçası, bu Ubuntu 18.04 olacak.
Örnek 3: OR Operatörünü When ile Kullanmak
OR operatörü ile, koşullardan biri yerine getirildiğinde görev yürütülür.
--- - hosts: all tasks: - name: Install Nginx on Debian apt: name=nginx state=present when: ansible_os_family == “Debian” or Ansible_os_family == “SUSE”
Yukarıdaki komutlar, Nginx web sunucularını Debian veya SUSE işletim sistemi ailesi veya her ikisine de kurar.
NOT: Bir koşulu test ederken daima çift eşitlik işareti == kullandığınızdan emin olun.
Döngülerdeki koşullu koşullar
Koşul ifadeleri bir döngüde de kullanılabilir. Örneğin, uzak bilgisayarlara yüklenmesi gereken birden çok paketin bir listesine sahip olduğunuzu varsayalım.
Aşağıdaki çalışma kitabında, kurulması gereken paketlerin listesini içeren paketler adlı bir dizimiz var. Gerekli yan tümce True olarak ayarlanırsa, bu görevler birbiri ardına gerçekleştirilecektir.
--- - 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 }}”on Debian apt: name: “{{ item.name }}” state: present When: item.required == True loop: “{{ packages }}”
Hata İşlemeyi Yapılandır
Bazen, çalışma kitapları çalıştırılırken görevler başarısız olur. Aşağıdaki çalışma kitabında gösterildiği gibi 3 sunucuda 5 görev yürüttüğünüzü varsayalım. Sunucu 2’deki görev 3’te (MySQL Başlatılıyor) bir hata oluşursa, Ansible sunucu 2’de kalan görevleri yürütmeyi durduracak ve kalan görevleri sunucuların geri kalanında tamamlamaya çalışacaktır.
--- - name: Install Software packages hosts: server1, server2, server3 tasks: - name: Install dependencies << some code >> - name: Install MySQL database << some code >> - name: Start MySQL << some code >> - name: Install Nginx << some code >> - name: Start Nginx << some code >>
Çalışma kitabının yürütülmesinde tutarlılık istiyorsanız, örneğin sunuculardan birinin arızalanması durumunda bir çalışma kitabının yürütülmesini durdurun seçeneğini ekleyin.
--- - name: Install Software packages hosts: server1, server2, server3 any_errors_fatal: true tasks:
Bu şekilde, bir sunucuda bir görev başarısız olursa, Ansible çalışma kitabının tüm sunucularda yürütülmesini durduracak ve çıkacaktır.
Çalışma kitabının hataları yok saymasını ve kalan görev grubunu yürütmeye devam etmesini istiyorsanız, o zaman ignore_errors: True seçeneğini kullanın.
--- - name: Install Software packages hosts: server1, server2, server3 tasks: - name: Install dependencies << some code >> ignore_errors: True
Sistemleri Belirli Bir Duruma Göre Yapılandırmak için Çalışma Kitapları Oluşturun
Bu bölümde, çalışma kitabını çalıştırırken kullanılabilen bazı ek seçeneklere bakıyoruz.
Kontrol modu veya DryRun seçeneğiyle başlayalım. Prova çalıştırma veya kontrol modu seçeneği, bir çalışma kitabı çalıştırılırken herhangi bir hatayla karşılaşılıp karşılaşılmayacağını ve yönetilen bilgisayarlarda yapılacak herhangi bir değişiklik olup olmadığını kontrol etmek için kullanılır. Ancak, uzak bilgisayarlarda herhangi bir değişiklik yapmaz.
Örneğin, Apache web sunucusu çalıştırmasını kuran ve başlatan httpd.yml adlı bir çalışma kitabını test etmek için:
# ansible-playbook httpd.yml --check

Bakmamız gereken diğer seçenek –start-at-task seçeneğidir. Bu, çalışma kitabının başlaması veya başlaması gereken görevin adını belirtirken kullanılır.
Bir örnek ele alalım: Aşağıdaki çalışma kitabı 2 görevi açıklamaktadır: İlk çalıştırma Apache web sunucusunu kurar ve ikincisi htop yardımcı programını kurar.
--- - name: Install httpd hosts: all tasks: yum: name: httpd state: Installed - name: Install htop yum: name: htop state: started
Apache web sunucusunu kurmayı atlamak ve bunun yerine htop yardımcı programını çalıştırmak istiyorsanız:
# ansible-playbook playbook.yml --start-at-task “Install htop”

Son olarak, etiketler seçeneğini gösterildiği gibi çalışma kitabınıza ekleyerek görevlerinizi veya komutlarınızı etiketleyebilirsiniz. Oldukça büyük bir çalışma kitabınız olduğunda ve tüm çalışma kitabından belirli görevleri çalıştırmak istediğinizde bu kullanışlı olur.
--- - name: Install httpd tags: Install and start hosts: all tasks: yum: name: httpd state: Installed tags: Install • service: name: httpd state: started
# ansible-playbook playbook.yml -tags "Install"
Etiketleri atlamak için gösterildiği gibi –skip-tags seçeneklerini kullanın.
# ansible-playbook playbook.yml --skip-tags "Install"
Yazının orijinalini buradan okuyabilirsiniz.

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.