Назад к вопросам
Middle+
86
questionbank

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

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Использую несколько основных подходов:

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

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

    # Запуск плейбука
    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: Руби-фрейм для тестирования состояния системы с использованием DSL.

    В Moleclue можно интегрировать Testinfra:

    # platforms section in molecule/default/molecule.yml
    platforms:
      - name: instance
        image: image_name
        # ... other platform settings
    
    # verifier section
    verifier:
      name: testinfra
      options:
        v: True
    

    Пример теста Testinfra (tests/test_default.py):

    # import 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.

Выбор конкретного подхода зависит от сложности роли/плейбука и требований к степени покрытия тестами. Обычно использую комбинацию этих методов.