Sobes.tech
Middle+

Как покривате Ansible с тестове?

sobes.tech AI

Отговор от AI

Използвам няколко основни подхода:

  • Синтактична проверка:
    Проверява правилността на синтаксиса на плейбуците и ролите преди тяхното изпълнение.

    # Проверка на синтаксиса на плейбука
    ansible-playbook --syntax-check playbook.yml
    
  • Идемпотентност:
    Проверява, че повторното изпълнение на плейбука не променя състоянието на системата след първото успешно изпълнение.

    # Изпълнение на плейбука
    ansible-playbook playbook.yml
    
    # Повторно изпълнение с флаг --check за проверка на промените
    ansible-playbook playbook.yml --check
    

    Изходът трябва да показва changed=0 run=true.

  • Molecule:
    Фреймуърк за локално или отдалечено тестване на роли Ansible. Позволява изпълнение на различни сценарии за тестване (linting, идемпотентност, тестване на функции).

    # Инициализация на 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_is_installed(host):
        # Проверка дали пакетът nginx е инсталиран
        nginx = host.package("nginx")
        assert nginx.is_installed
    
    def test_nginx_is_running(host):
        # Проверка дали услугата nginx е стартирана
        nginx = host.service("nginx")
        assert nginx.is_running
    
    def test_nginx_listens_on_port_80(host):
        # Проверка дали nginx слуша порт 80
        assert host.socket("tcp://0.0.0.0:80").is_listening
    
  • Интеграция с CI/CD:
    Автоматизиране на изпълнението на тестове в CI/CD пайплайн след всеки комит или Pull Request. Например, с използване на Jenkins, GitLab CI, GitHub Actions.

Изборът на конкретен подход зависи от сложността на ролята/плейбука и изискванията към степента на покритие с тестове. Обикновено използвам комбинация от тези методи.