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.