Index
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. IaC3 dünyasında komutun 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?
1 2 |
- name: Add myuser to sudoers shell: echo ' myuser ALL=(ALL) ALL' >> /etc/sudoers |
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 lineinfile4 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’in5 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
1 2 3 4 5 6 |
- hosts: localhost gather_facts: no vars_files: - configs/environment/{{ env }}/vpc.yml roles: - some-role |
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
1 2 3 4 |
ansible -v ansible -vv ansible -vvv ansible -vvvv |
yazarak sisteminizin ürettiği anlık olarak ekrana basılacak çıktıyı arttırabilir, daha kaliteli hata yakalama ve 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.
1 2 3 4 5 6 7 |
- name: debug process shell: Some text which calls fork command in linux :) register: some_output - debug: var: some_output.stdout_lines verbosity: 4 |
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ı
- Komutun sıkıntısız olarak çalışması(Exit code 0)
- Komutun düzgün olarak çalışmaması çalışması(Exit code 1)
- Eklenecek kullanıcının sistemde daha önce var olması hatası(Exit code 8)
- 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 🙂
1 2 |
- user: name: newuser |
Size minimum sıkıntı ile size istediğiniz sonucu verecektir.
Bir sonraki makalede Ansible dosya yapısı6nasıl olmalıdır konusuna değineceğim. Umarım faydanıza olur.