Открыть список
Как стать автором
Обновить

Комментарии 9

Вы это, ничего слаще баша в жизни не ели? pytest/testinfra с одной стороны, Ансибл с другой. Оба отлично умеют по SSH, один даёт офигенную выразительность и точность, второй позволяет делать/проверять чёрти-что за счёт гигантской коллекции модулей.

Пожалуйста, прочитайте ещё раз дисклеймер.
Статья ориентирована на начинающих, причём не на программистов, а на тестировщиков. Далеко не все тестировщики знают Python и, уж тем более, Ansible. А для понимания этой статьи достаточно базовых знаний Linux и Bash.
Главная цель статьи — внести понимание о системных тестах на виртуалках и об основных моментах, на которых нужно заострить внимание. Выбор инструментов, будь то bash, SSH или virt-builder — это лишь способ максимально упростить статью. Разумеется, я не рекомендую этот инструментарий для продакшена.

Я не верю в начинающего, способного писать на баше сколь-либо прилично. Я не верю в миддла, способного писать на баше сколь-либо прилично. Я не верю в сеньёра, способного писать на баше сколь-либо прилично, На баше умеют писать Гуру Баша (я не иронизирую), и это чертовски сложно.


Я за 20 лет своей карьеры так и не научился прилично писать на баше. Наговнякать я могу. Подмазать так, чтобы два куска кода с друг другом сошлись — могу.


Написать приличный тест я уже не смогу, мне надо будет неделю медитировать над тем, "как правильно писать на баше".


Сравните тесты, которые вы приводите, и тест на testinfra:


def test_ping(host):
    assert ' 0% packet loss' in host.check_output('ping 5.5.5.5 -c 5 -w 2')

Заметим, это в себя включает автоматом и поддержку пачки серверов, и ssh до него и т.д.

Тот же самый тест, который Вы привели, на баше будет выглядеть так:

ping 5.5.5.5 -c 5 -w 2

Нет. Если вы выполните этот код bash test.sh, то он пропингует 5.5.5.5 с вашей локальной машины.


Приведённый выше код:


  1. Возьмёт список хостов для тестов (либо из hosts в начале файла, либо из параметров запуска pytest).
  2. Подключится к каждому из хостов с его предпочтительным транспортом (например, ssh, правильным логином-паролем-ключом).
  3. Выполнит тест на каждом из хостов.
  4. Если один из хостов вернёт ошибку или фейльнит тест, то продолжит исполнять для остальных хостов.
  5. Выведет результат (показав, например, 19 хостов зелёненьким, а один красным).
  6. Выставит код возврата в не-ноль даже если фейльнулся хост №1, а остальные отработали нормально.

А ещё он даст возможность ограничить группу хостов, вывести подробную ошибку (например, expected ' 0% packet loss', got '20% packet loss', да ещё и подчеркнёт то место, где различия), пропустить часть тестов из тестсьюта.


Короче, человек, который джуниора тащит писать на баше тесты создаёт боль джуниору и проблему компании.

Я согласен с тем, что писать системные тесты для продакшена на баше — это плохая, плохая идея.
Но я также считаю, что использование баша в этой статье в познавательных целях вполне оправдано. Вы что-нибудь слышали о принципе «от простого к сложному?». Сейчас я объясняю базовые принципы. А в одной из следующих статей я могу написать «Ребятки, а помните сколько манипуляций мы делали, чтобы автоматизировать системные тесты на баше? Давайте теперь посмотрим, как теперь за нас это сделает инструмент Х».

Я не могу понять, почему из всех эзотерических языков программирования именно баш? Вам кажется, что баш — это проще, чем питон? (У меня на языке чешется сказать, что по той же логике брейнфак проще питона).

Потому что 99% всей работы делают утилиты, на которые я полагаюсь в этой статье. Потрудитесь изучить финальный скрипт и увидите, что подавляющая часть этого скрипта — это вызов утилит virsh, virt-builder, virt-install и ssh. Разумеется, вызывать эти команды из баша удобнее, чем из питона.

Почему я выбрал именно эти утилиты, а не WhateverYouWant? Потому что, потрудитесь, наконец, прочитать дисклеймер.

Кроме того, если у Вас за 20 лет стажа так и не сложились отношения с башем, это не значит, что у других дела обстоят так же. Я, как и многие другие люди, не считаю его эзотерическим. Для того, чтобы скомпозировать вызов нескольких утилит, он вполне годится, что я и сделал в этой статье. В следующих статьях я его использовать уже не планирую.

99% этой работы называется "ansible". С башом у меня не "не сложилось", я просто знаю, что на баше писать кратно сложнее, чем на любом другом языке программирования. Даже тривиальные условия превращаются в чёртову магию (как проверить вхождение подстроки в баше: enjoy: https://stackoverflow.com/questions/229551/how-to-check-if-a-string-contains-a-substring-in-bash), а уж в районе обработки сигналов и т.д… Лучше не надо.

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.