Ответ
Я выстраиваю pipeline тестирования для Ansible-ролей, используя Molecule в связке с Testinfra. Это позволяет проверять роли на изолированных инстансах перед их применением в production.
Мой стек и подход:
- Molecule: Запускаю тестовые сценарии (
molecule test) с разными драйверами (Docker, Vagrant) и дистрибутивами (Ubuntu, CentOS, AlmaLinux). - Testinfra: Пишу модульные тесты на Python для проверки состояния системы после применения роли.
- Интеграция с 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.
Такой подход значительно повышает надежность и переносимость инфраструктурного кода.