Sobes.tech
Middle+

Ansible-ı testlərlə necə əhatə edirsiniz?

sobes.tech Süni İntellekt

AI-dan cavab

Əsas yanaşmaları istifadə edirəm:

  • Sintaksis yoxlaması:
    Playbookların və rolların sintaksisinin düzgünlüyünü onların işlədilməsindən əvvəl yoxlayır.

    # Playbook-un sintaksisini yoxlamaq
    ansible-playbook --syntax-check playbook.yml
    
  • İdempotentlik:
    Playbook-un təkrarlanan işlədilməsi ilk uğurlu icra etdikdən sonra sistem vəziyyətini dəyişmədiyini yoxlayır.

    # Playbook-u işlət
    ansible-playbook playbook.yml
    
    # Dəyişiklikləri yoxlamaq üçün --check bayrağı ilə yenidən işlət
    ansible-playbook playbook.yml --check
    

    Çıxış changed=0 run=true göstərməlidir.

  • Molecule:
    Ansible rollarını yerli və ya uzaq test etmək üçün framework. Müxtəlif test ssenarilərini (linting, idempotence, funksional testlər) işlətməyə imkan verir.

    # Rolların qovluğunda Molecule-ni başlatmaq
    molecule init scenario -r default
    
    # Molecule testlərini işlətmək
    molecule test
    
  • Sistem səviyyəsində testlər (Functional Testing):
    Ansible tətbiq edildikdən sonra sistemin gözlənilən vəziyyətdə olub-olmadığını yoxlayır. Mən istifadə edirəm:

    • Testinfra: Konfiqurasiya tətbiq edildikdən sonra hostların və xidmətlərin vəziyyətini yoxlayır.
    • InSpec: DSL istifadə edərək sistem vəziyyətini test etmək üçün Ruby framework.

    Molecule-də Testinfra ilə inteqrasiya etmək mümkündür:

    # molecule/default/molecule.yml-də platformlar bölməsi
    platforms:
      - name: instance
        image: image_name
        # ... digər platforma parametrləri
    
    # verifier bölməsi
    verifier:
      name: testinfra
      options:
        v: True
    

    Testinfra ilə nümunə testi (tests/test_default.py):

    # testinfra-ni idxal et
    def test_nginx_quraşdırılıb(host):
        # nginx paketinin quraşdırıldığını yoxlayır
        nginx = host.package("nginx")
        assert nginx.is_installed
    
    def test_nginx işləyir(host):
        # nginx-in işlədiyini yoxlayır
        nginx = host.service("nginx")
        assert nginx.is_running
    
    def test_nginx 80 portunda dinləyir(host):
        # nginx-in 80 portunda dinlədiyini yoxlayır
        assert host.socket("tcp://0.0.0.0:80").is_listening
    
  • CI/CD inteqrasiyası:
    Hər commit və ya Pull Request-dən sonra testlərin CI/CD boru xəttində avtomatik işləməsini təmin edirəm. Məsələn, Jenkins, GitLab CI, GitHub Actions istifadə edərək.

Xüsusi yanaşmanın seçimi rol/playbook-un mürəkkəbliyinə və test əhatə dairəsi tələblərinə bağlıdır. Adətən, bu metodların birləşməsini istifadə edirəm.