Merhaba;
Ansible ile ilgili ikinci bir yazı yazmaya karar verdiğimde, bu yeni yazıyı yazmadan önce, ilk yazımı Linkedin’den bir okuyayım dedim fakat farkettim ki Ansible ile yazdığım yazıyı Linkedin platformunda değil kendi kişisel web sayfamda paylaşmışım (Ansible – Bölüm 1). Ansible ile ilgili yazdığım ilk makalemi, https://asiyeyigit.com/ansible/, bu yazıma başlamadan önce paylaşmak istiyorum. Belki önce bu ilk makaleyi okumak istersiniz diye.

Ansible’a bir otomasyon platform gözüyle bakmamız doğru olur. İçerisinde “Ansible playbook” ları oluşturmak için kullanılan otomasyon dili YAML’ı barındırmakla birlikte bu “playbook” ları çalıştıran bir motor (“engine”) de içermektedir. Ek olarak otomasyon altyapınızı “Ansible Tower” ile gelen UI ve Restful API özellikleri ile de yönetebilirsiniz. Ansible’ın ajan gerektirmeden çalışıyor olması, YAML’ın kullanım kolaylığı, Linux sistemlere ek olarak Windows ortamını da destekliyor olması ürünü daha çekici
bir hale getiriyor. Elbette dinamik veya statik envanterde bulunup bulunmamasına bakılmaksızın fiziksel sistemlerin yanı sıra, sanal sistemleri, ağ (“network”) cihazlarını da yönetebiliyor olması ürünün pek çok kurum tarafından neden kullanıldığını daha net açıklıyor.
https://docs.ansible.com/ansible/latest/modules/modules_by_category.html adresinden Ansible için yazılan modülleri kategorilere ayrılmış olarak görebileceğiniz gibi
https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html
adresinden tüm modüllere ulaşabilirsiniz. Ansible modül de ne demek derseniz. Yeri gelmişken belirteyim. Ansible’ın lokal veya uzaktan çalıştırabileceği yeniden kullanılabilir, bağımsız betiklerdir. Spesifik görevleri yerine getirmek için yazılırlar, lokal sisteminizle, API ile veya uzak bir sistemle etkileşim kurabilirler. Modülleri, Ansible API, Ansible veya “Ansible-playbook”lar kullanabilir. Modüller, çalıştırıldıklarında, standart çıktıya (“stdout”), JSON formatı basarak sonlanırlar. Modüllerin, Ansible’a bilgi dönüşü bu şekilde olur. Modül geliştirirken lokal kullanımınız için kendinizi iyi hissettiğiniz programlama dillerini kullanabilirsiniz (bash, C++, clojure, Python, Ruby gibi daha pek çok). Sanırım en yaygın olanı, Ansible modüllerinin Python ile geliştirilmesi.
“Playbook” ise bir veya birden fazla “play”den oluşan organize birimlerdir. “Playbook”lar, YAML ile yazılırlar. “Playbook”ların bir diğer önemli avantajı, bu betikleri CI/CD ortamınıza entegre edebilme kolaylığıdır. Her bir “play” yapılması gereken bir işi tanımlar. “Playbook”da yazacağınız, birden fazla “play” sayesinde, “web” sunucular için ayrı komut silsilesini, “veritabanı” sunucuları için ayrı komut setlerini çalıştırabilirsiniz.

Örneğin Şekil 1’de yazılmış “playbook”ta iki tane “play” mevcuttur. İlk “play”, “web” sunucular üzerinden çalışırken, ikinci “play”, veritabanı sunucuları üzerinde çalışmaktadır.
“Play”ler içerisinden kendi geliştirdiğiniz veya halka açık modülleri çağırabilirsiniz.

Şekil 1. Playbook örneği (2 adet play içermektedir).

Ansible, bir otomasyon platformudur derken aslında bu platform ile konfigürasyon yönetimi, orkestrasyon, uygulamaların hayata geçirilmesi (“application deployment”) ve provizyonlama işlemlerini yapabilirsiniz demek istedim. Bu durumda Şekil 2’yi gönül rahatlığıyla aşağıya ekleyebilirim.

Şekil 2. Ansible otomasyon platform. 

Ansible nasıl çalışır? Şekil 3. üzerinden, çalışma mantığını rahatlıkla kavrayabiliriz. Herşeyde olduğu gibi, süreç yine insan ile başlıyor. Yani bir kullanıcının yazdığı “playbook”, süreci başlatıyor. “Playbook”ların, YAML ile yazıldığını belirtmiştik. “Playbook”lar, tanımlanan modülleri çalıştırırlar. Modüllerde elbette işleri (“task”) ları çalıştırırlar. Çalışma sırası, yukardan aşağı doğru birbiri ardınadır. Modüller, hedef sisteminizde olmalıdır. Modüllerin, çalıştırılabilir kodlar olduğunu biliyoruz. Fakat, bu kodların içeriğini anlamak zorunda değilsiniz. Önemli olan, doğru argümanları bu koda geçirmenizdir. Bu modüllerde yine sizin, “playbook”larda belirleyeceğiniz hedef sistemler, hedef sistem grupları üzerinde çalışacaktır. 

Şekil 3. Ansible’ın çalışma mantığı.

Ansible, güçlü bir iddia ile ortaya çıkıyor ve diyor ki, ben DevOps’un diliyim (“The language of DevOps”). Farklı IT birimleri arasında, uygulama yaşam döngüsü ve CD yapısının uçtan uca otomotize edebilmeniz için size destek olurumu güçlü bir şekilde ifade ediyor. 

Ansible mimarisinde iki farklı makine türü mevcut: kontrol “node”lar ve yönetilen “host”lar. Ansible, kontrol “node” üzerine kurulur ve kontrol “node” üzerinden çalıştırılır. Bu “node”, Ansible proje dosyalarının da kopyalarını içerir. Bu sistem, Ansible Tower’ın çalıştığı sistem olabileceği gibi, sizin laptop’ınız, herhangi fiziksel/sanal bir sistem olabilir. Yönetilen “host”lar envanterde listelenir. Yönetilen “host”ları gruplar halinde de organize edebilirsiniz. Envanter, statik olarak oluşturabileceğiniz bir tekst dosya olabileceği gibi dış bir kaynaktan bir betik yardımıyla ürettiğiniz dinamik bir dosya da olabilir. 

Ansible’ın ajansız çalıştığını söylemiştik. Yani kullanıcı bir “playbook” ve “ad hoc” komut çalıştırdığında (ad hoc detayına gireceğim sonraki yazımda), kontrol “node”, yönetilen “host” a SSH veya WinRM ile bağlanır. Red Hat Ansible Tower, kontrol, güvenlik ve Yönetim fonksiyonları sayesinde, uçtan uca otomasyon süreçlerinizi tanımlayabileceğiniz  UI ve Restful API özelikleri de içeren enterprise bir temel yapı ortamı sunmaktadır. Hangi “host”lar üzerinde, kimlerin “playbook” çalıştıracağını kontrol edebildiğiniz gibi , Ansible işlerini kayıt altına alabileceğiniz, envanteri ve SSH kimliklerini yönetebileceğiniz bir ortamı sizlere sunmaktadır. 

Red Hat Ansible Automation Platform, standart  ve premium olarak iki farklı şekilde fiyatlanıyor. Fiyatlama, yönetilen “node” sayısına göre yapılıyor. Kontrol “node”un İşletim sistemi Linux olmak zorunda. Windows sistemler kontrol “node” olamaz ama yönetilen “host”lar olabilirler. Kontrol “node” üzerinde python 2.7 veya sonrası ya da 3.5 veya sonrası yüklü olmalıdır. Eğer Red Hat Enterprise Linux subscription varsa, RHEL kanallarını kullanarak Ansible’ı kısıtlı bir destek ile kurabilirsiniz. Fakat daha  kritik çalışmalarınız için tam Red Hat Ansible Engine subscription almanızı öneririm. Eğer Ansible’ı, Red Hat Enterprise Linux 7 Extras kanalını kullanarak kurduysanız, bundan sonra bu kanal üzerinden Ansible ve bağımlılıkları güncellenmiyor olacak. Eğer Windows sistemleri yönetecekseniz, “python2-winrm RPM” paketinin de (0.3.0 veya sonrası) yüklenmesi gerekmektedir. Yönetilen “host”larda eğer SELinux aktif ise, “libselinux-python” paketinin de yüklü olması gerekiyor.  Windows için geliştirilen pek çok modül, yönetilen “host” üzerinde “Python” dan ziyade PowerShell 3.0 veya sonrasını zorunlu kılmaktadır. Yine yönetilen “host”lar üzerinde, PowerShell uzak konfigürasyonu yapılmalıdır. Ek olarak, Ansible, yönetilen host üzerinde, .NET framework 4.0 veya sonrasına ihtiyaç duymaktadır. Ansible ile ağ (“network”) cihazlarınızı da (router, switch gibi) yönetebileceğinizi söylemiştim. Cisco IOS, IOS XR, NX-OS, Juniper Junos, Arista EOS ve VyOS-tabanlı  pek çok ağ cihazını yönetebilirsiniz.  Pek çok ağ cihazı Python çalıştıramayacağı için, Ansible, ağ modüllerini kontrol “host” üzerinde çalıştırır. Ağ cihazlarıyla haberleşmek için, “CLI over SSH”, “XML over SSH”, veya “API over HTTP(S)” gibi özel bağlantı yöntemleri kullanılır. Açıkcası ben bu yazı dizime, yönetilen “host”lar olarak Linux tabanlı sunucuları ele alarak devam ediyor olacağım.

Ansible’ın daha detayına girmeden önce, bu yazımda bahsettiğim genel mimariyi anlamakta kesinlikle fayda var. Daha sonra kurulum yapacağız ki, kurulum çok kolay, ilk yazımda da nasıl kurulum yapıldığını anlatmıştım. Sonrasında, Ansible konfigürasyonu yaparak “ad hoc” komutlardan bahsedeceğim. Yine ilk yazımda “ad hoc” komutlarını basit bir kaç komut çalıştırarak görmüştük.  Ansible bölüm-3’te tekrar görüşmek üzere bu yazımı tamamlıyorum. 

 

Asiye Yiğit – 4 Ocak 2010 Cumartesi

Kaynakça:

https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html 

https://docs.ansible.com/ansible/latest/dev_guide/developing_modules_general.html

https://docs.ansible.com/ansible/2.3/dev_guide/developing_modules_general.html

Udemy Ansible Essentials: Simplicity in Automation