Ansible ile Playbook Yazmak -1

Mert Kışlakçı
Turk Telekom Bulut Teknolojileri
5 min readAug 4, 2022

Selamlar, bu seride Ansible kısa bir giriş yapacağız. Akabinde Playbook yazarken kullanılan temel parametreleri tanıyıp bazı görevler için playbooklar yazacağız.

Ansible, platformlar arası yapılan işlemleri otomasyona dönüştürmeye yarayan Python temelli bir yazılım aracıdır. Ansible ile konfigürasyon yönetimi , uygulama dağıtımı , orkestrasyon ve diğer birçok manuel BT sürecini otomatize edebilirsiniz.

Ansible

Ansible, yapılandırmak istediğiniz sunuculara otomatik olarak bağlanarak manuel olarak yapılan talimatları sizin için çalıştırır. Bu talimatların yazıldığı dosyalara playbook’lar denir.

Ansible Playbook

Ansible Playbook’lar, tekrarlanabilir, yeniden kullanılabilir, basit bir yapılandırma yönetimi ve karmaşık uygulamaları ortamlara dağıtmak için yazılan talimat listesidir. Ansible Playbooklara bir kod dosyası diyemeyiz çünkü playbooklar .yaml’lardan oluşur ve YAML bir programlama dili değil, bir veri serileştirme dilidir.

Playbook yazmak için kullanılan .yaml hakkında bir bilgiliniz yoksa .yaml hakkında yazmış olduğum “Herkes için YAML” yazı dizisini okumanızı tavsiye ederim.

Playbooklarımı /etc/ansibledizisinde oluşturacağım dilerseniz sizde bu yolu kullanarak playbooklarınızı bu alana yazabilirsiniz.

Playbook Path

Serinin 1. Bölümünde öğreneceğimiz temel Playbook parametreleri:

  • name
  • hosts
  • become
  • gather_facts
  • tasks
  • debug
  • vars

- name

Açıklama yapmak için kullanılır. Playbook konsol üzerinde yürütülürken işlemlerin hangi aşamada olduğunun takibini kolaylaştırır. Üst bölümlerde /etc/ansible dizininde playbook1.yml isimli dosya oluşturmuştuk. Bu dosyanın içine aşağıdaki komutu girin.

---
- name: merhaba ilk ansible oyun kitabımı yazdım
hosts: all

ansible-playbook playbook1.yml komutunu terminal ekranında çalıştırdığınızda alacağınız çıktı:

- hosts

Ansible, birden fazla sistemde aynı anda çalışır. Varsayılan olarak /etc/ansible/hosts dizininde bulunan sunuculardan seçim yapar. Dizindeki dosyayı açtığınızda sizi karşılayacak içerik:

Hosts File

Hosts dosyasının içini temizleyerek aşağıdaki test sunucuları bu alana ekliyorum. Ayrıca köşeli parantez ile sunucular sınıflandırılabilir istenilen gruptaki hostların çalışması sağlanır. Ansible da iki varsayılan grup vardır: allve ungrouped. alltüm sunucuları içerir. ungroupedise all grubu içinde olmayan tüm sunucuları içerir.

cod.teams.com

[bravoteams]
cpt.price.com
lt.ghost.com
sgt.soap.com

Host dosyasına eklediğiniz tüm sunuculara bağlanmak için playbook’ta bulunan hosts parametresine all girin.

---
- name: sunucular
hosts: all

Playbook çalıştığında alacağınız çıktı:

Host

Çok sayıda sıralı makineleri eklemek için şu yöntemi kullanabilirsiniz.

[teams]
bravo-3.teams.com
bravo-4.teams.com
bravo-5.teams.com
bravo-6.teams.com
#Bunun yerine aşağıdaki gibi sayı ve harf şeklinde sıralı sunucuları eklemeniz mümkün.[teams]
bravo-[3:6].teams.com

Playbook dosyası:

---
- name: teams sunucuları
hosts: teams

Playbook çalıştığında alacağınız çıktı:

hosts

Standart olmayan SSH bağlantı noktalarında çalışan sunucunuz varsa iki nokta (:) ile port bilgisi tanımlayabilirsiniz.

bravo.six.com:6060

Hostun bağlantı türünü özelleştirmek isterseniz:

[sunucu]
www.test.com ansible_user=kullanıcı ansible_password=sifre

Host gruplarını birleştirme:

[turkey]
Istanbul
Ankara
Tokat
[usa]
NewYork
LosAngeles

[sehirler:children]
turkey
usa

Playbook dosyası:

---
- name: sehir sunucuları
hosts: sehirler

- become

Ansible ilgili sunucuya bağlandığında bazı işlemler için yetki yükseltmek gerekebilir. Örneğin 5 farklı sunucuda “ansible-teams” adlı bir grup oluşturmak gerekir. Bunu her makineye tek tek bağlanarak yapabilir yada süreci ansible üzerinden otomasyona dökebilirsiniz. Ansible ile hedef sunuculara grup eklemek istediğinizde “groupadd ansible-teams” benzeri bir komut yürütür fakat bu işlem root yetkisi gerektiğinden ansible makinesinin yetkisini root düzeyine çıkarmak için become komutu kullanılır. Bu sunucuda “sudo groupadd ansible-teams” çalıştırılmasına eşdeğerdir.

---
- name: Grup ekleme talimatlarını gönder
hosts: sunucu
become: yes
tasks:
- name: Add groups
ansible.builtin.group:
name: ansible-teams
state: present
Add Group

Sunucuda kayıtlı farklı bir kullanıcı olarak komut çalıştırmak için become_user yazmanız bunun öncesinde de become parametresini false yapmanız gerekmektedir. Become false çekilmesinin nedeni ansible.cfg dosyasında varsayılan olarak yer alan root yetkilerinin dahil etmemektir. Aşağıdaki playbookta mert kullanıcısıyla terminalde echo komutu yürüttük:

---
- name: terminal ekranina merhaba dunya yaz
hosts: sunucu
become: false
become_user: mert
tasks:
- name: mesaj
command: echo "merhaba dunya"
register: msg
- debug: var=msg.stdout_lines
playbook

Farklı yetki türleri arasında seçim yapmak için become_method kullanılır. Bu yetki türleri; sudo , su , pfexec , doas , pbrun , dzdo , ksu olabilir. become_user: nobody ekleyerek kullanıcı adını es geçebilirsiniz.

---
- name: terminal ekranina merhaba dunya yaz
hosts: sunucu
become: true
become_method: su
tasks:
- name: mesaj
command: echo "merhaba dunya"
register: msg
- debug: var=msg.stdout_lines

- gather_facts

Ansible bağlandığı sunucu hakkında; IP adresi, BIOS bilgisi, bir sistemin yazılım bilgisi ve hatta donanım bilgisi kısacası sunucu hakkında bilgi toplamaya yarar. Varsayılan olarak kapalı gelir. gather_facts JSON formatta tutulmaktadır.

gather_facts result

Bağlanılan sunucudan gather_facts yardımıyla hostname ve OS bilgilerini çekmek için:

---
- name: baglanti kurulan sunucu hakkinda toplanan bilgiler
hosts: sunucu
gather_facts: true
tasks:
- debug:
msg:
- "{{ ansible_hostname }}"
- "{{ ansible_distribution }}"
gather_facts

- tasks

Her playbook bir görev listesi içerir. Bu görevler tasks olarak nitelendirilir. Taskların amacı çok özel argümanlarla bir modülü yürütmektir. Bu yüzden yürütülecek talimatlar tasks altında sıralanması gerekmektedir. Bir playbook birden fazla tasks içerebilir. Bu görevler yukarıdan aşağıya doğru sırayla çalıştırılırlar. Aşağıdaki playbook da ansible makinesinin karşı makine üzerinden topladığı bilgileri ekrana yazdırmak için gerekli argümanlar tasks altına girilmiştir.

---
- name: baglanti kurulan sunucu hakkinda toplanan bilgiler
hosts: sunucu
gather_facts: true
tasks:
- debug:
msg:
- "{{ ansible_hostname }}"
- "{{ ansible_distribution }}"

- debug

Yürütme esnasında ifadeleri konsola yazdırmak ve çalışma kitabını durdurmadan değişkenlerde veya ifadelerde hata ayıklamak için kullanılır.

---
- name: Debug ile cekilen bilgiler
hosts: sunucu
gather_facts: true
tasks:
- debug:
msg:
- "Sunucu OS {{ ansible_distribution_version }}"
- "Sunucu versiyonu {{ ansible_distribution }}"
debug

- vars

Ansible, sistemler arasındaki farklılıkları yönetmek için değişkenleri (vars) kullanır. Farklı sistemler arasındaki varyasyonları temsil etmek için, listeler ve sözlükler dahil olmak üzere standart YAML sözdizimiyle değişkenler oluşturabilirsiniz. Bu değişkenleri oyun kitaplarınızda, envanterinizde , yeniden kullanılabilir dosyalarda veya rollerde veya komut satırında tanımlayabilirsiniz. Ayrıca, bir görevin dönüş değerini veya değerlerini yeni bir değişken olarak kaydederek çalışma kitabı çalıştırması sırasında değişkenler oluşturabilirsiniz.

---
- name: Toplama islemi
hosts: sunucu
vars:
x: 190.3
y: 10
tasks:
- debug:
msg: "Sonuc= {{ x*y }}"
vars

Bu yazı dizisinde temelde en sık kullanılan talimatlara giriş yaptık. Serinin bir sonraki bölümünde bu temel talimatlara ek yazılım dillerinden aşına olduğunuz birkaç algoritmayı .yaml kullanarak yazacağız. O zaman kadar esenlikle kalın, görüşmek üzere… :)

--

--

Mert Kışlakçı
Turk Telekom Bulut Teknolojileri

#Cloud Computing #vmware #virtualization #redhat #EdgeComputing #DataScience #AI #IoT #ComputerVision #Python #OpenCV #C #Virtualization