Ansible Nedir? Dosya yapısı nasıldır? Nasıl Kullanılır…

Birol EMEKLİ
Devops Türkiye☁️ 🐧 🐳 ☸️

--

Merhabalar,

Bu yazımda size ansible hakkında bilgi verdikten sonra kullanımı hakkında biraz bilgi vereceğim.

Ansible yönetiminizde olan sunucuların tek bir çatı altında istediğiniz herşeyi yapmaya olanak sağlayan, client istemcilere herhangi bir agent kurma ihtiyacı gerektirmeyen, Python ve Ruby dilleri ile geliştirilmiş özgür bir platformdur. Şuan da redhat çatısı altında bulunan ansible open source ve ticari olarak faliyet göstermektedir.

Ansible dosya yapısından biraz bahsetmek gerekirse. Ansible farklı roller içerebilmektedir. Her yapacağınız işlemi farklı rol olarak tanımlayabilirsiniz. Bu sayede dosyalarınız daha düzenli ve anlamlı olacaktır. Ben anlatımlarımı centos 7 üzerine kurulu olarak gerçekleştireceğim. Burada default dizin olarak /etc/ansible dizini altında dosyaları barındırmaktadır.

Kurulumu çok basit olduğu için geçiyorum buraya tıklayarak kurulum için yardım alabilirsiniz.

Şimdi basit bir role yapısı oluşturalım ve dosya dizinleri hakkında biraz bilgi verelim. /etc/ansible/roles dizi altında aşağıdaki komutla bir role oluşturulur.

ansible-galaxy init test

Bu komuttan sonra dosya düzeni bu şekilde oluşacaktır. Burada dosyaları biraz açıklarsak.

default: Bu rolde kullanılacak olan varsayılan değişkenlerin saklandığı dosyaları.

files: Burada uzak sunucuya yüklenmek istenilen dosyalar barındırılır.

handlers: Burada genelde servislerin durumlarını kontrol edebileceğimiz değişkenler saklanır. restart, stop, start gibi

meta: Burası oluşturulan rol hakkında bilgi verilen kısımdır. Buradaki bilgiler ansible tarafından okunarak gerekli bağımlılıklar tarafından sağlanır.

task: En önemli dosya diyebiliriz. Role tarafından yürütülecek görevler burada farklı dosyalar içerisinde bulunabilir.

templates: Burada sunucuya gönderilmek istenilen bir konfigürasyon falan varsa bulundurulur.

vars: Burada görevler tarafından kullanılacak olan değişkenler saklanır.

Kısaca ansible nedir ve dosya yapısı nasıl diye bilgi verdikten sonra basit örneklerle server ve client üzerinde biraz işlem gerçekleştirelim.

Server ip adresi: 172.16.4.184 - Centos 7
Client ip adresi: 172.16.4.155 - Centos 7

Burada ansible uzak sunucuya ssh üzerinden bağlantı sağlayarak görevleri yürütmektedir. İlk olarak sunucuda bir ssh oluşturalım ve clientte bu ssh public keyini göndererek iletişim kurmada kolaylık sağlayalım. Burada ssh oluştururken şifre oluşturmazsanız direk bağlanacaktır fakat şifre oluşturmanız güvenliğiniz için önemlidir. Ben burada şifre ile uğraşmamak için direk key oluşturup client sunucuya kopyalama işlem yapacağım.

ssh-keygen

centos 7 üzerinde bu komutla bir keygen oluşturuyorum ve aşağıdaki komut ile ssh public keyini karşı sunucu ile paylaşıyorum. Bu sayede bağlantıda herhangi bir şifre sormayacaktır.

ssh-copy-id 172.16.4.155

Eğer ansible server sunucunuz ele geçirilirse ssh root@172.16.4.155 diye yazdıklarında ssh key yüzünden şifre sormadan direk saldırgan içeride olacaktır. Bunun için ssh key oluştururken şifre koymanız önemlidir.

Ansible bağlantı kuracağı ip adreslerini /etc/ansible dizini altındaki hosts dosyasında tutmaktadır. Burada bağlantı sağlarken kullanılacak ip adresi,şifre gibi bilgiler barındırılır. Şimdi beraber client üzerinde hostname değişikliği için basit bir görev yazalım.

İlk olarak sunucu ile client arasındaki bağlantıyı test edelim.

[root@ansible ansible]# ansible 172.16.4.155 -m ping
172.16.4.155 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}

Yukarıda belirtilen adrese ansible ile ping atıldı ve success le başarılı olduğu görüldü. Bu aşamadan sonra istediğimiz görevi oluşturabiliriz. Client üzerinde hostname dhcpserver olarak bulunmaktadır. Bu ismi ansible-client olarak değiştirelim.

[root@ansible ansible]# cat hosts[client]
172.16.4.155

İlk olarak hosts dizini altında bir isim oluşturarak ip adresini belirtiyorum. Bu aşamadan sonra hosts olarak client verildiğinde bu isim altındaki tüm ip adresleri ile ilişkilendirilmektedir.

[root@ansible ansible]# cat hostname.yml 
- hosts: client
tasks:
— name: Hostname değiştirme
hostname:
name: ansible-client

— name: Restart
reboot:

Yukarıda hostname.yml adında /etc/ansible dizini altında bir dosya oluşturulmuş ve içerisine ansible komutu olan hostname ile client hostunun adının ansible-client olarak değiştirileceğini belirtiyorum. Bu değişikliğinin tamamlana bilmesi için değişiklikten sonra reboot işlemi gerçekleştiriyorum.

Bu işlem sonucunda oluşturulan playbook çalıştırılır ve sonuç resimdeki gibi başarılı olmuştur.

Gelin şimdi de basit bir örnek daha yaparak sonlandıralım. Mesela apache servisi kuralım ve start edelim. Yine bu işlemi hostname.yml dosyası içerisinde gerçekleştirelim. Makinenin ismini değiştirsin ve isim değişikliği olursa makineyi restart etsin sonra da apache kurulumunu yapsın.

[root@ansible ansible]# cat hostname.yml 
- hosts: client
tasks:
- name: Hostname degistirme
hostname:
name: ansible-client
register: durum

- name: Restart
reboot:
when: durum.changed
- name: Apache yukleme
yum:
name: httpd
state: latest

Evet yukarıda gözüktüğü gibi hostname değişikliği yapılmış ve bu durumun sonucu register komutu ile durum değişkenine atanmış. Daha sonra işlemde restart edilmek istenilmiş fakat bir when ile durum.changed diye birşey eklenmiş. Bu aşamadan sonra da apache yükleme için yum komutu kullanılmış. Şimdi gelin sonuç üzerinden bu playbook yorumuna beraber bakalım.

Şimdi yukarıda biz client üzerinde isim değişikliğini daha önce yapmıştık. Ama daha sonra aynı dosyaya apache yüklenmesi için yeni komutlar ekledik. Eee peki bu durumda bu görev nasıl çalışacak? Tekrar isim değişikliği mi yapılacak? Tabikide hayır. Ansible burada çok güzel işliyor. Eğer yapmak istediğiniz işlem daha önce yapılmış ise bu komutu çalıştırmıyor. Zaten yapılmış bu işlem neden zahmet edeyim :)) diyor.

Şimdi yukarıdaki resim üzerinden yorumlamaya başlarsak ilk olarak client üzerinde hostname bakıldı (sağ taraftaki client) ve httpd servisi kontrol edildi unit httpd.service could not be found ile yüklü olmadığını görüyoruz.

Daha sonra server üzerinde yazmış olduğumuz playbook çalıştırıyoruz. Farklı farklı renkler var yeşil, mavi, sarı… Ooo baya güzel birşeye benziyor :). Tabikide bu renkler hepsi değiştirilebilir ve bir anlam içeriyor.

Gördüğümüz gibi hostname değiştirme işlemi sonucu ok yazıyor ve yeşil. Burada ansible hostname bakıyor ve zaten makinenin hostname aynısı o zaman değiştirmiyor. Bu tamam zaten diyor kısaca.

Sıra restart işleminde ve mavi olmuş :) Ben hostname değişikliği sonucunu durum diye bir değişkene atamıştım ki makine isim değişikliği olursa restart etsin yoksa etmesin diyebilmek için. Burada durum değişkeni değişiklik yapmadığı için false oluyor ve reboot işlemi when komutu ile eğer durum.chaned yani durum değişkeni bir değişiklik yaparsa true olur ve o zaman burası çalışsın diyebiliyorum. Burada durum değişkeni false olduğu için yani hostname değişikliği bu çalıştırılmaya yapılmadığından reboot işlemi yapılmadan atlanılmıştır.

Ve daha sonr apache yükleme işlemine geçiliyor. Apache yükleme işlemi yapılıyor ve sarı. Sarılar bir değişiklik yapıldığı sinyalini vermektedir. Dada sonra sağ tarafta da gözüktüğü gibi systemctl httpd status ile kontrol sağlanıyor, httpd servisi yüklenmiş ama çalışmıyor. Start etmeyi unutmuşum :)).

[root@ansible ansible]# cat hostname.yml 
- hosts: client
tasks:
- name: Hostname degistirme
hostname:
name: ansible-client
register: durum

- name: Restart
reboot:
when: durum.changed
- name: Apache yukleme
yum:
name: httpd
state: latest
- name: Apache start
service:
name: httpd
state: started

Eğer yukarıdaki gibi en sonra apache start edilmesi eklenseydi servis çalışıyor olacaktı.

Ansible basitçe ve detaylı bir örnekle anlatmaya çalıştım. Artık geri kalanını siz hangi işlemi gerçekleştirecekseniz yapabilirsiniz. Buraya kadar okuduysanız teşekkürler :)

Bir başka yazımda görüşmek üzere

HOŞÇAKALIN :)

--

--