Sobes.tech
Middle+

Πώς καλύπτετε το Ansible με δοκιμές;

sobes.tech AI

Απάντηση από AI

Χρησιμοποιώ διάφορες κύριες προσεγγίσεις:

  • Έλεγχος σύνταξης:
    Ελέγχει τη σωστή σύνταξη των playbooks και ρόλων πριν από την εκτέλεσή τους.

    # Έλεγχος σύνταξης του playbook
    ansible-playbook --syntax-check playbook.yml
    
  • Ιδομενικότητα:
    Ελέγχει ότι η επανεκτέλεση του playbook δεν αλλάζει την κατάσταση του συστήματος μετά την πρώτη επιτυχημένη εκτέλεση.

    # Εκτέλεση του playbook
    ansible-playbook playbook.yml
    
    # Επανάληψη με την επιλογή --check για έλεγχο αλλαγών
    ansible-playbook playbook.yml --check
    

    Η έξοδος πρέπει να δείχνει changed=0 run=true.

  • Molecule:
    Πλαίσιο για δοκιμές ρόλων Ansible τοπικά ή απομακρυσμένα. Επιτρέπει την εκτέλεση διαφόρων σεναρίων δοκιμών (linting, idempotence, δοκιμές λειτουργικότητας).

    # Αρχικοποίηση Molecule στον κατάλογο του ρόλου
    molecule init scenario -r default
    
    # Εκτέλεση δοκιμών Molecule
    molecule test
    
  • Δοκιμές σε επίπεδο συστήματος (Functional Testing):
    Ελέγχουν ότι το σύστημα μετά την εφαρμογή του Ansible βρίσκεται στην αναμενόμενη κατάσταση. Χρησιμοποιώ:

    • Testinfra: Ελέγχει την κατάσταση των κόμβων και των υπηρεσιών μετά την εφαρμογή της διαμόρφωσης.
    • InSpec: Πλαίσιο Ruby για δοκιμές της κατάστασης του συστήματος με χρήση DSL.

    Στο Molecule, μπορεί να ενσωματωθεί το Testinfra:

    # τμήμα platforms στο molecule/default/molecule.yml
    platforms:
      - name: instance
        image: image_name
        # ... άλλες ρυθμίσεις πλατφόρμας
    
    # τμήμα verifier
    verifier:
      name: testinfra
      options:
        v: True
    

    Παράδειγμα δοκιμής Testinfra (tests/test_default.py):

    # εισαγωγή testinfra
    def test_nginx_installed(host):
        # Ελέγχει αν το πακέτο nginx είναι εγκατεστημένο
        nginx = host.package("nginx")
        assert nginx.is_installed
    
    def test_nginx_τρέχει(host):
        # Ελέγχει αν η υπηρεσία nginx τρέχει
        nginx = host.service("nginx")
        assert nginx.is_running
    
    def test_nginx_ακούει_στη_θύρα_80(host):
        # Ελέγχει αν το nginx ακούει στη θύρα 80
        assert host.socket("tcp://0.0.0.0:80").is_listening
    
  • Ενσωμάτωση CI/CD:
    Αυτοματοποιώ την εκτέλεση δοκιμών στη γραμμή αγωγής CI/CD μετά από κάθε commit ή Pull Request. Για παράδειγμα, με Jenkins, GitLab CI, GitHub Actions.

Η επιλογή της συγκεκριμένης προσέγγισης εξαρτάται από την πολυπλοκότητα του ρόλου/playbook και τις απαιτήσεις κάλυψης δοκιμών. Συνήθως, χρησιμοποιώ έναν συνδυασμό αυτών των μεθόδων.