Sobes.tech
Middle+

Cum acoperiți Ansible cu teste?

sobes.tech AI

Răspuns de la AI

Abordările principale pe care le folosesc sunt:

  • Verificarea sintaxei:
    Verifică corectitudinea sintaxei playbook-urilor și rolurilor înainte de a fi rulate.

    # Verificarea sintaxei playbook-ului
    ansible-playbook --syntax-check playbook.yml
    
  • Idempotence (Idempotent):
    Verifică dacă rularea repetată a playbook-ului nu schimbă starea sistemului după prima execuție de succes.

    # Rularea playbook-ului
    ansible-playbook playbook.yml
    
    # Rulare repetată cu flag-ul --check pentru verificarea modificărilor
    ansible-playbook playbook.yml --check
    

    Ieșirea ar trebui să afișeze changed=0 run=true.

  • Molecule:
    Framework pentru testarea rolurilor Ansible local sau de la distanță. Permite rularea diferitelor scenarii de testare (linting, idempotence, testare funcțională).

    # Inițializarea Molecule în directorul rolului
    molecule init scenario -r default
    
    # Rularea testelor Molecule
    molecule test
    
  • Testare la nivel de sistem (Functional Testing):
    Verifică dacă sistemul după aplicarea Ansible se află în starea așteptată. Folosesc:

    • Testinfra: Verifică starea gazdelor și a serviciilor după aplicarea configurației.
    • InSpec: Framework Ruby pentru testarea stării sistemului folosind DSL.

    În Molecule, se poate integra Testinfra:

    # secțiunea platforms în molecule/default/molecule.yml
    platforms:
      - name: instance
        image: image_name
        # ... alte setări ale platformei
    
    # secțiunea verifier
    verifier:
      nume: testinfra
      opțiuni:
        v: True
    

    Exemplu de test Testinfra (tests/test_default.py):

    # importarea testinfra
    def test_nginx_instalat(host):
        # Verifică dacă pachetul nginx este instalat
        nginx = host.package("nginx")
        assert nginx.is_installed
    
    def test_nginx_rulează(host):
        # Verifică dacă serviciul nginx rulează
        nginx = host.service("nginx")
        assert nginx.is_running
    
    def test_nginx ascultă pe portul 80(host):
        # Verifică dacă nginx ascultă pe portul 80
        assert host.socket("tcp://0.0.0.0:80").is_listening
    
  • Integrare CI/CD:
    Automatizez rularea testelor în pipeline-ul CI/CD după fiecare commit sau Pull Request. De exemplu, folosind Jenkins, GitLab CI, GitHub Actions.

Alegerea abordării specifice depinde de complexitatea rolului/playbook-ului și de cerințele de acoperire a testelor. De obicei, folosesc o combinație a acestor metode.