Daha kaliteli Ansible nasıl yazılır(Part 1)


Bundan önceki yazdığım Ansible serisinde1 genellikle Nedir? sorusuna değinmiştim. Bu yazıda Ansible ile çalışırken, yaptığımız işleri daha düzenli ve geliştirilebilir yapmak için nasıl sorusu ile uğraşacağız.

Her programlama dilinde olduğu gibi Ansible yazarken de, uyulması gereken bir kaç pattern2 mevcuttur. Bu yazıda bunların bir kaçına değinmeye çalışacağım.

1 Idempotence

1.1 Nedir ve Nasıl sağlanır

Dikkat: Ansible yazarken en ama en dikkat etmeniz gereken özellik budur!

Türkçeye çevirdiğinizde eş güçlü anlamına gelen bu kelime. IaC dünyasında komudun her çalışmasından sonra aynı sonucu vermesi anlamına geliyor. Peki ya sizin yazdığınız her komut aynı sonucu veriyor mu? Bunu nasıl sağlayabilirsiniz.

Örnek vermek gerekirse, aşağıdaki kod çalıştırıldığında her çalıştırıldığında size birbirinin tıpatıp aynısı makineler üretir mi?

Hayır üretmez, sebebi ise yukarıda yazılmış komut, çalıştırıldığı her seferinde bu satırın var olup olmadığını kontrol etmeden, tekrar ve tekrar bu satırı sudoers dosyasına yazmasıdır. Bu sebepten dolayı yaptığınız ürettiğiniz makinelerde birbirinden farklı olmaya başlar ve ileride sorunlar çıkarabilir.

Bu yüzden Ansible Playbook veya Role yazarken, bu durumu mümkün kılacak şekilde kod yazmanız tavsiye edilir. Yukarıda verdiğim örneğin çözümü olan lineinfile3 modülüne bakmanız tavsiye edilir.

2 Yaml lint

  • Lint işlemi çalışma bakımından çok bir sıkıntı yaratmasa da işi doğru yapma bakımından, önemli bir kuraldır, kabullenmedir.
  • Açık kaynak olarak geliştirilen ansible-lint’in4 nasıl kullanılacağını buradan öğrenebilirsiniz.

3 Modülleri daha efektif kullanma

3.1 Performans örnekleri

  • Ansible sizi yormamak adına size bir çok bakımdan kolaylıklar sunuyor. Bu yapılar ile çalışırken, daha fazla performans almak için bazı özellikleri kapatmak veya gerektiğinde açmak daha doğrudur.

3.1.1 gather_facts

3.1.2 verbose

verbose komut satırı ile çalışırken, genellikle işlerin nasıl gittiğini daha detaylı olarak görme amacı ile kullanılan bir sistemdir. Bu yapıyı Ansible’da da kullanabilirsiniz. Örnek vermek gerekirse

yazarak sisteminizin ürettiği anlık olarak ekrana basılacak çıktıyı arttırabilir, daha kaliteli hata ayıklama işlemi yapabilirsiniz.

Ansible’nin bize varsayılan olarak verdiklerinin yanısıra, sizde istediğiniz çıktıları belirlediğiniz verbose sayısına göre istediğiniz çıktıyı istediğiniz zaman alıp istediğiniz zaman kapatabilirsiniz.

3.2 Shell, Raw, Command modülleri

Shell, Raw, Command modülleri ile Ansible içerisinde script çalıştırabileceğiniz modüllerdir. Bu modüller ile bash, sh veya farklı bir kabuk dilini kullanabilirsiniz. Ancak bu durumda çıkacak hataları sizin kontrol etmeniz gerekmektedir. Bu yüzden bu modülleri mecbur kalmadıkça kullanmamanız tavsiye edilir.

Örnek olarak;

Eğer sizden Linux makineye bir kullanıcı eklemeniz istendiyse bunu

Shell ile yaparsanız Kontrol etmeniz gerekli if koşulları

  1. Komutun sıkıntısız olarak çalışması(Exit code 0)
  2. Komutun düzgün olarak çalışmaması çalışması(Exit code 1)
  3. Eklenecek kullanıcının sistemde daha önce var olması hatası(Exit code 8)
  4. Komutu çalıştıracak kullanıcının yetkilerinin ne olduğu(Exit code blablabla )

Gibi sistemin vereceği exit codeler ile çözmek zorunda olacaksınız.

Ama ansible ile öyle mi 🙂

Size minimum sıkıntı ile size istediğiniz sonucu verecektir.

Bir sonraki kısımda partta Ansible dosya yapısı5 olmalıdır konusuna değineceğim. Umarım faydanıza olur.