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

Ответ

Я выстраиваю 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.

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

Ответ 18+ 🔞

А, ну вот, опять про эти ваши пайплайны и тестирование. Слушай, я тут тоже в эту тему вляпался, и скажу тебе честно — сначала было ощущение, будто хуй с горы на тебя катится, а ты должен его поймать и вставить куда надо. Но разобрался, и теперь, блядь, без этого жить не могу.

Вот как у меня всё устроено, ёпта:

  1. Molecule: Это такая мартышлюшка, которая для тебя виртуалки поднимает, роли туда закидывает и смотрит, что получилось. Запускаешь molecule test — и понеслась. Можно на Docker'е гонять, можно на Vagrant — кому что ближе. Я, например, гоняю на Ubuntu и AlmaLinux, чтобы покрыть овердохуища сценариев.
  2. Testinfra: А это уже, собственно, проверяльщик. Пишешь на Python'е простые тесты, типа "а установился ли пакет?", "а сервис ли запущен?". Чистая магия, а не инструмент.
  3. CI/CD: Ну и куда же без этого. Настроил в GitLab CI так, что на каждый пулл-реквест эта вся машинерия запускается сама. Сидишь, пьешь кофе, а тебе пишут: "всё ок, можно мержить" или "чувак, ты тут хуйню написал, всё сломал". Доверия ебать ноль к самому себе, поэтому пусть железо проверяет.

Вот, смотри, как я проверяю, что 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

А самое главное, что проверяю дополнительно — это пиздопроебибна важная штука:

  • Идемпотентность: Это когда запускаешь роль второй раз, а она тебе говорит: "да похуй, чувак, я всё уже сделала, изменений ноль". Если она начинает что-то менять — это тревожный звоночек, значит, где-то хитрая жопа затесалась.
  • Качество кода: Тут в дело вступает ansible-lint. Он как занудный преподаватель, который тычет тебе в каждую запятую и орет: "так не пишут, идиот!"
  • Синтаксис: Ну и yamllint с ansible-playbook --syntax-check — чтобы вообще не было опечаток, из-за которых всё накрывается медным тазом.

Честно, после того как внедрил эту систему, спать стал спокойнее. Раньше бывало запустишь плейбук на продакшене — и сидишь, бздишь, ждешь, будет вам хиросима или нет. А теперь хоть какая-то уверенность есть, что сломаешь не всё сразу.