Ansible

Ansible Plays ve Playbooks Nasıl Oluşturulur – 5. Bölüm

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
check disk usage of Ansible managed nodes
Ansible tarafından yönetilen düğümlerin disk kullanımını kontrol edin

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
dry run a Ansible playbook
bir Ansible çalışma kitabını test edin

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”
Install Packages using Ansible Playbook
Ansible Playbook kullanarak Paketleri Kurun

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.