Herkes için Otomasyon – Ansible ve AWX

Zaman hepimiz için çok değerli. Bilişim sektörü çalışanları olarak bu zamanı en uygun şekilde değerlendirebilmek için otomasyon sistemlerine de muhakkak hakim olmamız gerekiyor. Otomasyon denilince aklınıza bir çok farklı araç gelebilir fakat yazının ana konusu Ansible (AWX) üzerine olacak. IT operasyonlarını otomatize etmek isteyen fakat nereden başlayacağını bilemeyen veya mevcut seçenekler arasında seçim yapamayan arkadaşlar için umarım bilgilendirici bir yazı olur. Uzun zamandır yazmayı düşündüğüm fakat minik kızımın dünyaya gelmesinin yaklaştığı şu günlerde vakit bulamadığım için çok fazla üzerine düşemediğim bir konu.

Nedir bu Ansible ? diye merak ediyorsanız doğru yerdesiniz. Teknik yetkinliklerinden önce, biraz geriye dönüp tarihine bakacak olursak Ansible asında 2012 yılında ortaya çıkan bir startup projesi. 2 – 2.5 sene sonra da Red Hat tarafından satın alınıp kendi ekosistemlerine dahil ediliyor. Ürün başlı başına güzel fakat bu noktaya gelmesinde Red Hat’in payı da oldukça büyük.

En basit hali ile IT operasyonlarını otomatize etmek için yazılmış bir framework. Nasıl otomatize ettiğinde ileride değineceğiz fakat nedirin cevabı tam olarak bu.

Geçmişte “Chef, Puppet vb.” farklı otomasyon araçlarını da denemiş biri olarak olarak son 1 yıldır aktif olarak Ansible kullanıyorum ve oldukça memnunum. Ansible tarafında en çok sevdiğim şey ise oldukça yalın bir dil olan YAML ile Playbook yazarak, hızlı bir şekilde yapmak istediğim işlerimi otomatize edebilmem. Yani bu Ansible kullanabilmek için yazılımcı olmanıza ya da yazılımdan anlamanıza gerek yok.

Ansible Tower ; Ansible yönetimi için bir kullanıcı ara yüzü fakat ben yazımın devamında anlatırken örneklerimi Ansible Tower’ın açık kaynak kodlu versiyonu olan AWX üzerinden örnekler vererek anlatacağım. Ansible Tower ya da AWX kullanmak şart değil fakat bence oldukça kullanışlı dizayn edilmiş ara yüzü ve UI ile beraber gelen gelişmiş API desteği için muhakkak kullanın.

Resim-1

Ansible tarafında ilk aşamada bilinmesi gereken 3 temel komponent üzerinden devam edelim ve ne işe yaradıklarından bahsedelim.

  1. Inventory
  2. Playbook
  3. Modules

Inventory: Üzerinde otomasyon yapacağız cihazlarımızı ya da sunucularımızı yani hostlarımızı tanımladığımız yer. Katalog gibi düşünebilirsiniz. Kullanım amacınıza göre farklı farklı bir çok envanter ya da tüm hostlarınız için tek bir envanter oluşturarak hostlarınızı bu envanterler içerisine ekleyebilirsiniz. Ansible’ın aslında çıkış noktası network cihazları yani network otomasyonu için de olukça yetenekli bir framework . Network cihazlarınızı ve sunucularınızı ayırmak için farklı farklı inventory’ler oluşturmak yönetim açısından sizi oldukça rahatlatacaktır.

Inventory oluşturduktan sonra içerisine girip “hosts” kısmında , playbook üzerinden bu envantere bağlanırken kullanılacak değişkenleri de belirterek hızlıca host ekleyebiliriz.

Bu örnekte ben “webserver1” diye bir host tanımladım. Değişkenler sunucu tipine göre farklılıklar gösterecektir. Aşağıda görmüş olduğunuz sunucu Windows bir server olduğu için Ansbile Connection method “winrm” , Winrm transport type ise “ntlm” olarak set edilmiş durumda. Eğer bu bir Linux sunucu olsaydı farklı değerler yazacaktım. Bu tanımlamayı yaptıktan sonra hazırladığım Playbok içerisinde “hosts” kısmında webserver1 yazarak çalıştırırsam ansible hangi ip adresli sunucuya hangi method ile bağlanacağını gelip bu değişken bilgisini okuduktan sonra öğrenecek ve sunucuya bağlanacak.

Resim-2

Aynı method ile aynı envater içerisine 2 nci bir web sunucusu daha ekledikten sonra. Groups altında + butonuna basarak “websunuculari” isimli bir grup oluşturup biraz önce eklediğim 2 host’u bu gruba dahil ediyorum.

Artık oluşturduğum grup ile , bu gruba üye olan tüm sunucular için yazdığımız playbook içerisindeki taskları sırası ile çalıştırabiliriz. Ne işimize yarayacak derseniz, senaryoyu biraz genişleterek bu operasyonu 100 adet sunucu üzerinde uyguladığımızı hayal edin. Grupların bize sağladığı en büyük avantaj aynı operasyonu birden fazla host üzerinde uygulamak istediğimiz zaman (örnek olarak 100 adet host için) her bir host için ayrı ayrı Playbooklar hazırlamadan sadece “hosts” kısmına grup adını yazıp operasyonu daha kolay yönetebilmemizi sağlaması.


Resim-3

Playbooklar: Playbook’ları Microsoft tarafındaki Runbook’lara benzetebilirsiniz. Temelde otomatize edilmek istenen işleri sırası ile Task’lar halinde alt altya yazdığımız, kullanılacak değişkenleri ve diğer bütün bilgileri girdiğimiz YAML formatındaki dosyalar.

Hemen 2 aşamalı küçük bir örnek yapalım ve basit bir servisi start edelim. Playbook yazmaya başlarken ilk önce playbook’umuza bir isim vererek otomatize etmek istediğimiz işlemleri hangi host\device (Bu bir sunucuda olabilir, network cihazıda) üzerinde uygulamak istiyorsak “hosts” kısmında belirterek ilgili sunucuya bağlanıyoruz.

---
- name: Start nginx
  hosts: host.name.ip
  become: true

Sonrasında ise uygulamak istediğimiz operasyonları “tasks” altında listeliyoruz.

tasks:
- name: Start NGiNX
  service:
    name: nginx
    state: started

En sonunda ise karşımıza aşağıdaki gibi 9 satırlık bir Playbook çıkıyor. Envanter ve değişken kullanımı burada en çok işimize yarayacak şeylerden birisi. Bakıldığında tek sunucu için anlamı olmayabilir fakat Host kısmını biraz değiştirerek neler yapabileceğimize hızlıca bir bakalım.

---
- name: Start nginx
  hosts: host.name.ip
  become: true
tasks:
- name: Start NGiNX Service
  service:
    name: nginx
    state: started

Biraz önce bahsettiğimiz grup yapısına örnek olması açısından örneği zenginleştirelim. Diyelim ki yönettiğimiz 100 adet Nginx server var ve hepsini Ansible üzerinde host olarak ekledik. Eklediğimiz 100 nginx hostu daha kolay yönetebilmek için ” all_nginxservers” diye bir grup oluşturarak 100 adet sunucuyu bu gruba üye yaptık. Artık playbook içerisinde “hosts” kısmında direk ilgili grubu çağırarak, uygulanmasını istediğiniz işin grup üyesi 100 adet server üzerinde çalışmasını sağlayabiliriz.

---
- name: Start nginx
  hosts: all_nginxservers
  become: true
tasks:
- name: Start NGiNX Service
  service:
    name: nginx
    state: started

Modüller ise playbook’lar vasıtası ile direk ilgili hostlar üzerinde çalıştırdığımız önceden hazırlanmış scriptler – komut setledir. Bir çok farklı dilde hazırlanmış olabilir hatta siz kendiniz de modül yazıp ansible içerisine ekleyerek playbook üzerinden çağırabilirsiniz. Şu anda aktif olarak kullanabileceğiniz binlerce hazır modül mevcut, modül listesine buraya tıklayarak ulaşabilirsiniz

Yine bir örnek üzerinden ilerleyerek inceleyim. Dosya Koplayama adında bir task oluşturarak “win_copy” modülünü çağırıp Source ve Destination bilgilerini girdikten sonra Playbook’u çalıştırdığımızda olan şey aslında;

Playbook’un gidip “win_copy” modülünü çağırarak belirtilen değişkenlerdeki yerden dosyayı alıp yine belirtilen yere kopyalası.

tasks:
- name: Dosya Kopyalaya
  Win_copy: src=/var/lib/data/test.ps1 dest=C:\test.ps1

Her bir modül ile ilgili detaylı bilgiye Ansible dökümanlarından ulaşıp hangi değişkeni hangi formatta kullanmanız gerektiğini ilgili doküman üzerinden kontrol edebilirsiniz. Oldukça detaylı açıklamalar ve en altta örnekler mevcut. Win_copy modülü için buraya tıklayarak incelerseniz kolayca aklınıza yatacaktır.

TaAGs: Ansible, Ansible Tower, AWX, Playbook, Ansible Modules, Automation

Share via
Copy link