Какой у вас опыт с автоматизированным тестированием в Ansible?

«Какой у вас опыт с автоматизированным тестированием в Ansible?» — вопрос из категории Ansible, который задают на 24% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Я выстраиваю pipeline тестирования для Ansible-ролей, используя Molecule в связке с Testinfra. Это позволяет проверять роли на изолированных инстансах перед их применением в production.

Мой стек и подход:

  1. Molecule: Запускаю тестовые сценарии (molecule test) с разными драйверами (Docker, Vagrant) и дистрибутивами (Ubuntu, CentOS, AlmaLinux).
  2. Testinfra: Пишу модульные тесты на Python для проверки состояния системы после применения роли.
  3. Интеграция с CI/CD: Настраиваю запуск Molecule в GitLab CI или GitHub Actions при каждом пулл-реквесте.

Пример теста для роли, устанавливающей Nginx:

# tests/test_nginx.py (Testinfra)
def test_nginx_package(host):
    nginx = host.package("nginx")
    assert nginx.is_installed
    assert nginx.version.startswith("1.20")

def test_nginx_service(host):
    nginx = host.service("nginx")
    assert nginx.is_running
    assert nginx.is_enabled

def test_nginx_listening(host):
    socket = host.socket("tcp://0.0.0.0:80")
    assert socket.is_listening

Ключевые проверки:

  • Идемпотентность: Запуск роли дважды подряд не должен вызывать изменений (molecule converge дважды).
  • Качество кода: Использую ansible-lint для проверки стиля и лучших практик.
  • Валидация синтаксиса: yamllint и ansible-playbook --syntax-check.

Такой подход значительно повышает надежность и переносимость инфраструктурного кода.