Покрываешь ли Ansible Role тестами?

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

Ответ

Да, я обязательно покрываю Ansible роли тестами. Это критически важно для обеспечения их надежности, идемпотентности и переносимости. Мой стандартный стек для тестирования включает:

  1. Molecule: Для создания тестовых сценариев (converge, idempotence, verify) в изолированных окружениях (Docker, Vagrant).
  2. Testinfra: Для написания модульных тестов, проверяющих фактическое состояние системы после применения роли.
  3. Linters: ansible-lint и yamllint для статического анализа кода на соответствие best practices.

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

# molecule/default/molecule.yml
platforms:
  - name: instance
    image: geerlingguy/docker-ubuntu2004-ansible
provisioner:
  name: ansible
verifier:
  name: testinfra
# molecule/default/tests/test_default.py
def test_nginx_package_is_installed(host):
    nginx = host.package("nginx")
    assert nginx.is_installed

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

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

Эти тесты интегрированы в CI/CD пайплайн (GitHub Actions/GitLab CI), который запускается при каждом пулл-реквесте.