Ansible Rollerinin Sürekli Test Edilmesi: Molecule ve Travis CI ile Uçtan Uca Bir Yaklaşım (Ubuntu 18.04)
Günümüzün hızla değişen IT altyapılarında otomasyon, operasyonel verimlilik ve tutarlılık sağlamanın temel taşıdır. Ansible, basit, güçlü ve ajansız yapısıyla konfigürasyon yönetimi, uygulama dağıtımı ve orkestrasyon görevleri için popüler bir otomasyon aracıdır. Ancak, otomasyonun kendisi yeterli değildir; otomasyon kodunun (bu durumda Ansible rolleri) güvenilirliğini ve beklenen şekilde çalıştığını sürekli olarak doğrulamak kritik öneme sahiptir. İşte bu noktada sürekli test (Continuous Testing) devreye girer.
Bu makale, Ansible rollerini geliştirenler ve yönetenler için uçtan uca bir sürekli test stratejisi sunmaktadır. Özellikle Ubuntu 18.04 üzerinde Molecule test çerçevesini kullanarak Ansible rollerini yerel olarak test etme ve ardından bu testleri Travis CI ile otomatikleştirerek her kod değişikliğinde çalışmasını sağlama sürecini adım adım açıklayacağız. Bu yaklaşım, hataları erken aşamada tespit etmenize, regresyonları önlemenize ve Ansible otomasyonunuzun kalitesini artırmanıza yardımcı olacaktır.
Neden Ansible Rolleri İçin Sürekli Test?
Ansible rolleri, karmaşık altyapıların temelini oluşturur. Bu rollerin doğru ve güvenilir bir şekilde çalışması, sistemlerin istikrarlı ve güvenli olmasını sağlar. Sürekli test, bu güvenilirliği sağlamak için vazgeçilmezdir.
Güvenilirlik ve Tutarlılık
Testler, Ansible rollerinizin farklı ortamlarda (örneğin, farklı Linux dağıtımları veya versiyonları) beklenen şekilde davrandığını doğrular. Bu, dağıtımlar arasında tutarlılık sağlar ve beklenmeyen davranışları en aza indirir.
Hata Tespiti
Geliştirme sürecinin erken aşamalarında hataları tespit etmek, onları üretim ortamında bulmaktan çok daha ucuz ve kolaydır. Sürekli test, kod değişiklikleri yapılır yapılmaz potansiyel sorunları otomatik olarak ortaya çıkarır.
Regresyon Önleme
Yeni özellikler eklerken veya mevcut kodu iyileştirirken, daha önce çalışan işlevselliği bozma riski her zaman vardır. Kapsamlı bir test paketi, yeni değişikliklerin mevcut davranışları olumsuz etkilemediğinden emin olmanızı sağlayarak regresyonları önler.
Geliştirme Hızlandırma
Geliştiriciler, kodlarında yaptıkları değişikliklerin güvenli olduğunu bilerek daha hızlı ve daha güvenle çalışabilirler. Otomatik testler, manuel test süreçlerine harcanan zamanı azaltır ve geliştirme döngüsünü hızlandırır.
Belgeleme ve Anlaşılabilirlik
İyi yazılmış testler, rolün ne yapması gerektiğini ve nasıl davranması gerektiğini açıkça gösteren yaşayan bir belge görevi görür. Bu, yeni ekip üyelerinin rolün amacını ve işlevselliğini anlamalarına yardımcı olur.
Temel Araçlar
Bu sürekli test çözümünü uygulamak için birkaç temel araca ihtiyacımız olacak. Her birinin rolünü kısaca açıklayalım.
Ansible
Otomasyonun kalbinde yer alan Ansible, sunucuların, ağ cihazlarının ve diğer altyapı bileşenlerinin konfigürasyonunu yönetmek için kullanılır. Roller, Ansible’ın yeniden kullanılabilir otomasyon mantığını düzenlemek için kullandığı yapıdır.
Molecule
Molecule, Ansible rollerini test etmek için tasarlanmış bir test çerçevesidir. Geliştiricilerin rolü birden fazla senaryoda, farklı sürücüler (Docker, Vagrant, OpenStack vb.) ve doğrulayıcılar (Testinfra, InSpec) kullanarak test etmelerini sağlar. Molecule, yerel geliştirme ortamınızda tutarlı ve tekrarlanabilir test ortamları oluşturmak ve yönetmek için mükemmeldir.
Travis CI
Travis CI, GitHub depolarıyla sorunsuz bir şekilde entegre olan bulut tabanlı bir sürekli entegrasyon (CI) hizmetidir. Bir depoya yapılan her kod değişikliğinde (push veya pull request), Travis CI otomatik olarak bir sanal makine başlatır, bağımlılıkları yükler ve testleri çalıştırır. Bu, kodunuzun her zaman test edildiğinden ve dağıtıma hazır olduğundan emin olmanızı sağlar.
Docker
Molecule ile birlikte Docker, hafif ve izole test ortamları oluşturmak için kullanılır. Her test çalıştırması için yeni bir Docker kapsayıcısı başlatmak, testlerin temiz bir ortamda çalışmasını sağlar ve testler arasında çakışmaları önler. Bu, test döngülerini hızlandırır ve kaynak tüketimini azaltır.
Testinfra
Testinfra, Python tabanlı bir test çerçevesidir ve sunucuların durumunu test etmek için kullanılır. Molecule ile entegre olarak, Ansible rolünüzün bir sistemi başarıyla yapılandırdıktan sonra beklenen durumda olup olmadığını doğrulamak için kullanılır. Örneğin, bir servisin çalışıp çalışmadığını, bir paketin kurulu olup olmadığını veya bir dosyanın içeriğini kontrol edebilirsiniz.
Ortam Kurulumu
Bu bölümde, Ansible rol testleri için gerekli araçları Ubuntu 18.04 işletim sistemine nasıl kuracağımızı adım adım inceleyeceğiz.
Ubuntu 18.04 Hazırlığı
Varsayılan olarak, bir Ubuntu 18.04 sunucusuna veya sanal makinesine sahip olduğunuzu varsayıyoruz. İlk adım olarak, sisteminizi güncelleyelim ve gerekli paketleri kuralım:
sudo apt update
sudo apt upgrade -y
sudo apt install -y python3 python3-pip python3-venv
Python’un varsayılan sürümünü 3 olarak ayarlamak isteyebilirsiniz veya python3 komutunu kullanmaya devam edebilirsiniz. Biz bu makalede python3 ve pip3 kullanacağız.
Ansible Kurulumu
Ansible’ı Python’ın paket yöneticisi pip aracılığıyla kurmak en iyi yöntemdir, çünkü bu, en güncel sürümü edinmenizi sağlar.
pip3 install ansible
Kurulumu doğrulamak için:
ansible --version
Docker Kurulumu
Molecule’un Docker sürücüsünü kullanabilmek için Docker Engine’ı kurmamız gerekiyor:
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
Kullanıcıyı docker grubuna ekleyerek sudo olmadan Docker komutlarını çalıştırmasını sağlayın (değişikliğin etkili olması için oturumu kapatıp açmanız gerekebilir):
sudo usermod -aG docker $USER
Docker’ın çalıştığını test edin:
docker run hello-world
Molecule ve Bağımlılıkları Kurulumu
Şimdi Molecule’u ve onun Docker sürücüsü ile Testinfra doğrulayıcısını kuralım:
pip3 install molecule docker testinfra
Kurulumu doğrulamak için:
molecule --version
Bir Ansible Rolü Oluşturma
Test sürecini göstermek için basit bir Nginx kurulum rolü oluşturacağız. Bu rol, bir Ubuntu sistemine Nginx’i kuracak ve servisi başlatacaktır.
Örnek Rol Senaryosu
Rolümüz, Nginx web sunucusunu kuracak ve varsayılan olarak 80 numaralı portta çalıştığından emin olacaktır.
Rol Yapısı
Ansible Galaxy komutunu kullanarak temel bir rol yapısı oluşturalım:
ansible-galaxy init my_nginx_role
cd my_nginx_role
Şimdi tasks/main.yml dosyasını düzenleyerek Nginx kurulum görevlerini ekleyelim:
# my_nginx_role/tasks/main.yml
---
- name: Nginx paketini kur
ansible.builtin.apt:
name: nginx
state: present
update_cache: yes
- name: Nginx servisinin çalıştığından ve başlangıçta etkin olduğundan emin ol
ansible.builtin.systemd:
name: nginx
state: started
enabled: yes
Basit bir handler ekleyelim (şu an için kullanılmasa da, iyi bir uygulama örneği):
# my_nginx_role/handlers/main.yml
---
- name: Nginx servisini yeniden başlat
ansible.builtin.systemd:
name: nginx
state: restarted
Varsayılan değişkenler için defaults/main.yml:
# my_nginx_role/defaults/main.yml
---
nginx_port: 80
Rolü Molecule ile Entegre Etme
Şimdi oluşturduğumuz Nginx rolünü Molecule ile test edilebilir hale getireceğiz.
Molecule İnitialization
Rol dizinimizin içinde Molecule senaryosunu başlatalım. Docker sürücüsünü ve varsayılan senaryo adını kullanacağız:
molecule init scenario --scenario-name default --driver-name docker
Bu komut, molecule/default/ dizini altında bir dizi dosya oluşturacaktır:
molecule.yml: Molecule yapılandırma dosyası.create.yml: Test ortamını oluşturan playbook.destroy.yml: Test ortamını yok eden playbook.converge.yml: Rolü test ortamına uygulayan playbook.verify.yml: Testinfra testlerini çalıştıran playbook.playbook.yml: Rolü çağıran ana playbook.
molecule.yml Yapılandırması
Oluşturulan molecule/default/molecule.yml dosyasını açalım ve içeriğini kontrol edelim. Genellikle varsayılan ayarlar çoğu senaryo için yeterlidir, ancak bazı değişiklikler yapabiliriz. Örneğin, Ubuntu 18.04 tabanlı bir Docker imajı kullanmak isteyebiliriz:
# my_nginx_role/molecule/default/molecule.yml
---
dependency:
name: galaxy
driver:
name: docker
platforms:
- name: instance
image: ubuntu:18.04
# Nginx'in dinleyeceği portu dışarıya açalım
published_ports:
- "{{ nginx_port }}:80"
provisioner:
name: ansible
playbooks:
converge: converge.yml
verifier:
name: testinfra
Burada published_ports ekledik, böylece Nginx’in çalışıp çalışmadığını dışarıdan kontrol edebiliriz.
playbook.yml
Bu dosya, molecule converge komutu çalıştırıldığında Molecule tarafından kullanılan ana playbook’tur. Rolünüzü çağırdığından emin olun:
# my_nginx_role/molecule/default/playbook.yml
---
- name: my_nginx_role rolünü test edin
hosts: all
gather_facts: false
roles:
- role: my_nginx_role
verify.yml (Testinfra Testleri)
Bu dosya, Molecule’un verify aşamasında çalıştırılacak Testinfra testlerini içerir. molecule/default/tests/test_default.py dosyasını açın ve aşağıdaki testleri ekleyin:
# my_nginx_role/molecule/default/tests/test_default.py
import os
import pytest
import testinfra.utils.ansible_runner
test_host = testinfra.utils.ansible_runner.AnsibleRunner(
os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('all')[0]
@pytest.fixture(scope='module')
def host(request):
return test_host
def test_nginx_is_installed(host):
"""
Nginx paketinin kurulu olup olmadığını kontrol eder.
"""
nginx = host.package("nginx")
assert nginx.is_installed
def test_nginx_running_and_enabled(host):
"""
Nginx servisinin çalıştığını ve başlangıçta etkin olduğunu kontrol eder.
"""
nginx = host.service("nginx")
assert nginx.is_running
assert nginx.is_enabled
def test_nginx_listens_on_port_80(host):
"""
Nginx'in 80 numaralı portu dinlediğini kontrol eder.
"""
# Molecule.yml'deki nginx_port değişkenini varsayıyoruz.
# Varsayılan değer 80 olduğu için direkt 80'i kontrol edebiliriz.
# Eğer farklı bir port kullanılıyorsa, o portu kontrol etmek gerekir.
assert host.socket("tcp://0.0.0.0:80").is_listening
def test_nginx_welcome_page_accessible(host):
"""
Nginx'in varsayılan karşılama sayfasının erişilebilir olduğunu kontrol eder.
"""
# curl komutu ile yerel olarak Nginx'e istek gönderiyoruz.
# Çıktıda "Welcome to nginx!" ifadesinin olup olmadığını kontrol ediyoruz.
command = host.run("curl -s http://localhost")
assert command.rc == 0
assert "Welcome to nginx!" in command.stdout
Bu testler, Nginx paketinin kurulu olup olmadığını, servisinin çalışıp çalışmadığını, 80 numaralı portu dinleyip dinlemediğini ve varsayılan karşılama sayfasının erişilebilir olup olmadığını kontrol eder.
Local Testing with Molecule
Molecule ile yerel testler, kodunuzu GitHub’a göndermeden önce hızlı geri bildirim almanızı sağlar. Bu, geliştirme döngüsünü hızlandırır ve hataları erken aşamada yakalar.
Temel Molecule Komutları
Molecule, bir dizi komut sağlar:
molecule create: Test ortamını (Docker kapsayıcısı) oluşturur.molecule converge: Ansible rolünü oluşturulan test ortamına uygular.molecule verify: Testinfra testlerini çalıştırır.molecule destroy: Test ortamını yok eder.molecule test:create,converge,verifyvedestroyadımlarını sırasıyla çalıştıran tam bir test döngüsüdür. Bu, genellikle en çok kullanacağınız komuttur.molecule login instance: Test ortamına SSH bağlantısı kurmanızı sağlar. Sorun giderme için çok kullanışlıdır.
Şimdi rolümüzü test edelim:
cd my_nginx_role
molecule test
Bu komutun çıktısı, Molecule’un Docker kapsayıcısını oluşturduğunu, Ansible rolünü uyguladığını, Testinfra testlerini çalıştırdığını ve ardından kapsayıcıyı yok ettiğini gösterecektir. Tüm testler başarılı olursa, çıktının sonunda Verifier completed successfully. mesajını görmelisiniz.
Eğer bir test başarısız olursa, Molecule size hangi testin başarısız olduğunu ve nedenini bildirecektir. Bu durumda, kodu düzeltip tekrar molecule test komutunu çalıştırabilirsiniz.
Travis CI Entegrasyonu
Yerel testler harika olsa da, sürekli entegrasyon (CI) sistemleri, her kod değişikliğinde testlerin otomatik olarak çalıştırılmasını sağlayarak otomasyonu bir adım öteye taşır.
GitHub Deposu Hazırlığı
Ansible rolünüzü bir GitHub deposuna yüklemeniz gerekmektedir. Eğer henüz yapmadıysanız, bir GitHub deposu oluşturun ve rolünüzü buraya gönderin:
cd my_nginx_role
git init
git add .
git commit -m "Initial commit of my_nginx_role"
git remote add origin https://github.com/your-username/my_nginx_role.git # Kendi deponuzla değiştirin
git push -u origin master
Travis CI Hesabı ve Depo Aktivasyonu
- Travis CI web sitesine gidin (travis-ci.com).
- GitHub hesabınızla oturum açın.
- Profil ayarlarınıza gidin ve yeni deponuzu senkronize edin (genellikle otomatik olarak görünür).
- Deponuzu bulun ve yanındaki anahtarı açarak Travis CI entegrasyonunu etkinleştirin.
.travis.yml Dosyası Oluşturma
Travis CI’ın projenizi nasıl test edeceğini bildiği yer, deponuzun kök dizininde bulunan .travis.yml dosyasıdır. Bu dosyayı my_nginx_role dizininin köküne oluşturalım:
# my_nginx_role/.travis.yml
---
language: python
python:
- "3.7" # Ubuntu 18.04'te varsayılan Python 3.6 olsa da, Travis CI'da 3.7 yaygın kullanılır.
# Daha yeni versiyonları da kullanabilirsiniz.
services:
- docker # Molecule'un Docker sürücüsünü kullanabilmesi için Docker servisini etkinleştirin
install:
# Bağımlılıkları yükle: Ansible, Molecule, Docker sürücüsü, Testinfra
- pip install ansible molecule docker testinfra
script:
# Molecule test komutunu çalıştır
# Bu komut, create, converge, verify ve destroy adımlarını içerir.
- molecule test
İsteğe bağlı: Ortam değişkenleri
env:
global:
# Ansible'ın log seviyesini ayarlayabilirsiniz, hata ayıklama için faydalı olabilir
- ANSIBLE_VERBOSITY=1
İsteğe bağlı: Bildirimler
notifications:
email:
recipients:
- your-email@example.com # Test sonuçlarını almak istediğiniz e-posta adresi
on_success: change # Başarılı olduğunda sadece ilk değişimde veya başarısız olduktan sonra bildirim gönder
on_failure: always # Başarısız olduğunda her zaman bildirim gönder
Bu .travis.yml dosyası şunları yapar:
language: python: Projenin Python tabanlı olduğunu belirtir.python: "3.7": Testlerin Python 3.7 ortamında çalışmasını sağlar.services: docker: Docker servisini başlatır, bu Molecule’un Docker kapsayıcıları oluşturabilmesi için gereklidir.install: Testler başlamadan önce gerekli Python paketlerini (Ansible, Molecule, docker, testinfra) kurar.script: Test çalıştırma komutunu tanımlar. Buradamolecule testkomutunu çalıştırıyoruz.envvenotifications: İsteğe bağlı olarak ortam değişkenleri ve bildirim ayarları ekleyebilirsiniz.
Travis CI Çalışma Akışı
.travis.yml dosyasını deponuzun köküne ekledikten sonra, bu değişikliği GitHub’a gönderin:
git add .travis.yml
git commit -m "Add .travis.yml for Travis CI"
git push origin master
Bu push işlemi, Travis CI tarafından otomatik olarak algılanacak ve yeni bir derleme (build) başlatılacaktır. Travis CI arayüzüne giderek derlemenizin durumunu izleyebilirsiniz. Travis CI şunları yapacaktır:
- Yeni bir Ubuntu sanal makinesi (veya kapsayıcısı) başlatır.
installbölümündeki komutları çalıştırarak bağımlılıkları (Ansible, Molecule, Docker, Testinfra) kurar.scriptbölümündekimolecule testkomutunu çalıştırır. Bu, Molecule’un test Docker kapsayıcısını oluşturmasını, Ansible rolünü uygulamasını, Testinfra testlerini çalıştırmasını ve ardından kapsayıcıyı yok etmesini tetikler.- Tüm adımlar başarılı olursa, derleme “Passed” olarak işaretlenir. Herhangi bir adım başarısız olursa (örneğin, bir Testinfra testi başarısız olursa), derleme “Failed” olarak işaretlenir ve size e-posta veya başka bir bildirim kanalı aracılığıyla bilgi verilir.
Bu süreç, her kod değişikliğinde rolünüzün kalitesini otomatik olarak doğrular ve sürekli geri bildirim sağlar.
İleri Konular ve En İyi Uygulamalar
Sürekli test stratejinizi daha da güçlendirmek için bazı ileri konuları ve en iyi uygulamaları göz önünde bulundurabiliriz.
Farklı Platformlarda Test
Ansible rollerinizin sadece Ubuntu 18.04’te değil, farklı Linux dağıtımlarında (örneğin, CentOS 7, Ubuntu 20.04) veya hatta farklı sürümlerde de çalıştığından emin olmak isteyebilirsiniz. Molecule’un platforms bölümünü kullanarak birden fazla test hedefi tanımlayabilirsiniz:
# my_nginx_role/molecule/default/molecule.yml
---
... diğer ayarlar ...
platforms:
- name: ubuntu-1804
image: ubuntu:18.04
published_ports:
- "{{ nginx_port }}:80"
- name: ubuntu-2004
image: ubuntu:20.04
published_ports:
- "{{ nginx_port }}:80"
- name: centos-7
image: centos:7
published_ports:
- "{{ nginx_port }}:80"
...
Bu, molecule test komutunun her bir platform için ayrı ayrı testleri çalıştırmasını sağlayacaktır.
Çoklu Senaryolar
Bir rolün farklı konfigürasyonlarını veya isteğe bağlı özelliklerini test etmek için Molecule’da birden fazla senaryo oluşturabilirsiniz. Örneğin, Nginx’in SSL ile veya farklı bir portta çalıştığı senaryolar:
molecule init scenario --scenario-name ssl_nginx --driver-name docker
Bu, molecule/ssl_nginx/ altında yeni bir dizin oluşturur. Her senaryonun kendi molecule.yml, playbook.yml ve tests dizini olabilir. Testleri çalıştırmak için molecule test -s ssl_nginx komutunu kullanırsınız.
Test Kapsamı
Testinfra ile sadece servisin çalışıp çalışmadığını değil, daha derinlemesine kontroller yapabilirsiniz:
- Dosya İçerikleri: Nginx konfigürasyon dosyasının (
/etc/nginx/nginx.conf) belirli direktifleri içerip içermediğini kontrol edin. - Kullanıcı ve İzinler: Nginx’in belirli bir kullanıcı altında çalıştığını ve ilgili dizinlerin doğru izinlere sahip olduğunu doğrulayın.
- Idempotency Kontrolü: Ansible rolünün birden fazla kez çalıştırıldığında sistemde ek bir değişiklik yapmadığını doğrulayın. Molecule’un
idempotencedoğrulayıcısı bu amaçla kullanılabilir. - Güvenlik Duvarı Kuralları: Gerekli portların güvenlik duvarında açılıp açılmadığını kontrol edin.
Bağımlılık Yönetimi
Eğer rolünüz başka Ansible rollerine bağımlıysa, bu bağımlılıkları requirements.yml dosyasına ekleyebilir ve Travis CI’da ansible-galaxy install -r requirements.yml komutuyla kurabilirsiniz. Bu komutu .travis.yml dosyasındaki install bölümüne eklemeniz gerekir.
Performans Optimizasyonu
Büyük projelerde test süreleri uzayabilir. Travis CI’da önbellekleme kullanarak bağımlılıkların her seferinde yeniden indirilmesini önleyebilirsiniz. Docker imajlarını optimize etmek ve testleri daha küçük, daha odaklı parçalara ayırmak da performansı artırabilir.
Güvenlik Tarama Entegrasyonu
Gelişmiş bir CI/CD hattında, statik kod analizi araçlarını (örneğin, Ansible-lint) veya güvenlik tarama araçlarını (örneğin, Trivy ile Docker imajı tarama) Travis CI sürecinize entegre ederek güvenlik açıklarını otomatik olarak tespit edebilirsiniz.
Bildirimler
Travis CI, e-posta, Slack veya diğer hizmetler aracılığıyla build durum bildirimleri gönderebilir. .travis.yml dosyasındaki notifications bölümünü yapılandırarak ekibinizin her zaman test sonuçlarından haberdar olmasını sağlayabilirsiniz.
Sonuç
Ansible rollerinin sürekli testi, modern DevOps uygulamalarının vazgeçilmez bir parçasıdır. Bu makalede, Molecule ve Travis CI’ı kullanarak Ansible rolleriniz için sağlam bir sürekli test çerçevesini Ubuntu 18.04 üzerinde nasıl uygulayacağınızı adım adım öğrendik.
Molecule, yerel geliştirme ortamınızda hızlı ve tekrarlanabilir testler yapmanızı sağlarken, Travis CI, her kod değişikliğinde testlerin otomatik olarak çalıştırılmasını sağlayarak güvenilirliği ve tutarlılığı artırır. Docker’ın hafif ve izole test ortamları sunması, test döngülerini hızlandırır ve Testinfra, sistem durumunu doğrulama konusunda güçlü bir esneklik sağlar.
Bu araçları ve metodolojiyi benimseyerek, Ansible otomasyonunuzun kalitesini önemli ölçüde artırabilir, hataları erken aşamada tespit edebilir, regresyonları önleyebilir ve geliştirme ekiplerinizin daha hızlı ve daha güvenle çalışmasını sağlayabilirsiniz. Sürekli test, yalnızca otomasyon kodunuzun doğruluğunu sağlamakla kalmaz, aynı zamanda altyapınızın genel istikrarına ve güvenliğine de katkıda bulunur.