Ответ
Да, я обязательно покрываю Ansible роли тестами. Это критически важно для обеспечения их надежности, идемпотентности и переносимости. Мой стандартный стек для тестирования включает:
- Molecule: Для создания тестовых сценариев (converge, idempotence, verify) в изолированных окружениях (Docker, Vagrant).
- Testinfra: Для написания модульных тестов, проверяющих фактическое состояние системы после применения роли.
- 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), который запускается при каждом пулл-реквесте.