Herkes için Otomasyon – Ansible ve AWX

Zaman  hepimiz için çok değerli. Bilişim sektörü emekçileri olarak değerli olan 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.  

Nedir bu Ansible ? diye merak ediyorsanız doğru yerdesiniz.  Teknik yetkinliklerine gelmeden , 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 aracı kullanabilmek için yazılımcı olmanıza ya da yazılımdan anlamanıza gerek yok. 

Ansible Tower ; Ansible yönetimi için kullanılan 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 yada AWX kullanmak şart değil fakat bence oldukça kullanışlı dizayn edilmiş ara yüzü ve ara yüz ile beraber gelen gelişmiş API desteği için muhakkak kullanın.

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 sadece sunucular üzerinde değil özellikle network cihazları tarafında da 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.

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 , üyesi 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 de uygulayabilirdik. 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 farklı 100 adet playbook hazırlamadan “hosts” kısmına sadece grup adını yazıp operasyonu daha kolay yönetebilmemizi sağlaması.

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