Инфраструктура как код и TDD

11

Инфраструктура как код подсказывает нам использовать инструменты, которые автоматизируют ваши сборки. Отлично. Такие инструменты, как ansible , chef , puppet , salt stack и другие, подталкивают нас к написанию того, как выглядит инфраструктура, при устранении различий.

В соляном стеке эти биты называются состояниями . Если состояние не соответствует действительности, инструмент разрешит его для нас. Другими словами - мы пишем тест для нашей инфраструктуры, и если тест не пройден, инструмент исправит его самостоятельно. По крайней мере, это идея.

XP учит нас использовать TDD, и вопрос в том, применимо ли это к инфраструктуре? Инструменты предполагают, что это так.

Я могу представить несколько типов тестов, которые могут быть очень полезными.

Мы пишем дымовые тесты, которые связаны с развернутой службой, чтобы гарантировать, что развернутая служба работает и работает должным образом. Это будет вызов API или проверка systemctl, чтобы убедиться, что то, что мы только что развернули, работает. Большая часть этой функциональности может быть реализована в одних и тех же состояниях, поскольку такие инструменты, как ansible, имеют состояния, обеспечивающие работу службы.

Существует проект Molecule, который позволяет запускать отдельные роли (так как ansible называет их состояния) для докера или другого временного механизма виртуализации. Это заставляет разъединять роли и позволяет выполнять их изолированно от сборника пьес при работе с ними. Тесты в основном позволяют проверять переменные, с которыми должна работать роль. Другие примеры выглядят как дублирование ANSIBLE движка (утверждают, что файл принадлежит пользователю ...).

ThoughtWorks тек радар прямо сейчас хвалит инструменты , такие как Inspec , serverspec или Госс для проверки того, что сервер соответствует спецификации. Но мы пишем спецификацию, не так ли?

Так есть ли смысл в дальнейшем тестировании инфраструктуры, если мы описываем инфраструктуру в состояниях / ролях? Я мог бы подозревать, что это становится более необходимым в более крупных организациях, где одна команда предоставляет спецификацию, а другая следует, или, если существует большой набор ролей, может быть, вы хотите запустить их подмножество и получить выгоду от тестов? Я изо всех сил пытаюсь понять, почему вы написали бы тест, если бы вы могли иметь роль / состояние для того же вопроса.

JackLeo
источник

Ответы:

6

Короче говоря, я вижу две категории тестов для вашей инфраструктуры: 1) есть ли у вас все необходимое для запуска вашего приложения и 2) нет ли у него лишних вещей.

Прежде всего, вы можете рассматривать набор тестов вашего реального программного обеспечения как своего рода «мета-тест» для вашей инфраструктуры. Пока вы создаете инфраструктуру с нуля для каждого запуска теста, а набор тестов полностью работает на этой инфраструктуре (то есть не использует внешние службы), тот факт, что весь пакет зеленый, означает, что вашей кодифицированной инфраструктуры также достаточно ,

Во-вторых, особенно с точки зрения безопасности, вы можете написать тесты для вашей инфраструктуры. То есть, если одна часть вашей инфраструктуры - это виртуальная машина под управлением Linux, вы можете написать тест, который выполняет сканирование портов для этой виртуальной машины, чтобы убедиться, что нет непреднамеренных открытых портов, которые могли быть установлены непреднамеренным apt-get installпобочным эффектом. , Или вы можете написать тесты, которые проверяют, были ли какие-либо неожиданные файлы изменены после того, как ваш надлежащий набор тестов завершен. Или вы можете проверить psвыходные данные ваших виртуальных машин или контейнеров Docker на наличие непредвиденных процессов и т. Д., Создать белые списки и т. Д. И, таким образом, получить автоматическое уведомление, если какой-либо сторонний пакет был изменен недокументированным (или незаметным образом) при некотором обновлении.

Эти тесты второго типа, в некотором роде, аналогичны тем, которые вы в любом случае выполняли бы в классических настройках ops, т.е. укрепляли свои серверы и проверяли наличие вторжений, избегая полного использования ресурсов и тому подобного.

Anoe
источник
Так что через некоторое время я занял именно такую ​​позицию. Части, выполняемые ansible, не проверяются сами по себе, но побочные эффекты этих действий проверяются с помощью goss. Так, например, RPM установлен (отвечающий) и затем проверяется, установлен ли ожидаемый файл по умолчанию или служба запущена и прослушивает определенный порт. Я не хочу, чтобы исправить эту проблему автоматически, но получать уведомления и остановить прогресс. Конечно, Ansible также может протестировать систему для вас, вам просто нужно goss
прояснить ситуацию
1

ИМХО, довольно избыточно писать тесты TDD для элементов, полностью охватываемых спецификацией состояния IaaC. Это подразумевает, что эффективность IaaC сомнительна - зачем вам его использовать, если так?

Глядя на это с другой точки зрения, сам IaaC (если / когда все сделано правильно) включает в себя возможности, уже проверенные и считающиеся надежно работающими. Что делает его привлекательным и делает излишним написание тестов на соответствие TDD.

Например, конфигурация IaaC, определяющая систему с установленным SSH, уже включает в себя надежную проверку правильности установки SSH и, если нет, механизмы для его правильной установки. Что делает тест TDD для проверки, установлен ли SSH, избыточным. Если ваша конфигурация IaaC также указывает, что sshd должен быть запущен и прослушивать определенный порт, тогда тесты TDD для запуска sshd и прослушивания соответствующего порта также будут излишними.

Обратите внимание, что мой ответ не нацелен на TDD или какой-либо другой тип тестирования, который проверяет, соответствует ли ваша конфигурация IaaC в целом определенной цели. Это остается в силе и может использоваться при проверках TDD, CI или аналогичных при разработке этой спецификации IaaC - я считаю, что ответ @ AnoE применим в таком случае.

Дэн Корнилеску
источник
Применяете ли вы то же самое мнение, чтобы убедиться, что SSH (или что-то еще) включено на конкретном пользовательском порту, который анализируется из внешнего файла конфигурации? Это не опора на проверенные устройства, это новая логика.
Джон Лауридсен
1
Он должен быть частью IaaC, если он его поддерживает. Если нет - тогда это обсуждение на самом деле не применимо. Да, это может повлиять на то, как много вещей может быть покрыто IaaC, но это другое обсуждение.
Дэн
1
Я также предполагаю, что мы не находимся в контексте, где требуются избыточные проверки - в некоторых случаях могут потребоваться избыточные проверки, следуя совершенно другим путям кода или даже инфраструктуре.
Дэн
1

Похоже, что все здесь предполагают, что инструмент IAC всегда работает так, как ожидалось, но я могу сказать (из моего собственного опыта), что это не всегда так, в противном случае модульное тестирование будет фактически бесполезным.

Я помню картинку с надписью «Запустил сборник пьес, все хорошо», а на заднем плане горело здание ...

Запуск декларативного состояния и наличие сервера в этом фактическом объявленном состоянии - это две разные вещи с моей точки зрения и опыта, по крайней мере.

Широкая и неоднородная среда, распределенная по нескольким DC, доступная через общедоступную сеть и т. Д. Есть несколько причин, по которым состояние не может быть применено, полностью или частично.

По всем этим причинам есть место для модульного тестирования, позволяющего получить снимок фактического состояния сервера, который, опять же, может отличаться от целевого состояния.

Поэтому я бы сказал, да, модульное тестирование полезно даже в управляемой IAC среде.

РЕДАКТИРОВАТЬ

Как насчет нерегрессионной стороны ветви dev базы кода IaC? чтобы вы вносили изменения в свой код в ветке dev и объединяли его с веткой prod, надеясь не сломать все? модульное тестирование настолько ценно и обычно просто в реализации, что я не понимаю, почему можно было бы написать код без этой функции.

Ссылка (на французском извините за это): https://fr.slideshare.net/logilab/testinfra-pyconfr-2017

пирс
источник
1
Это было бы по крайней мере вежливо, чтобы добавить какой-то комментарий с отрицательным голосом, вы не думаете, избиратель? Особенно по этому вопросу, где дебаты могут быть очень информативными или даже конструктивными.
Пирс
Я предполагаю, что тон вашего ответа, который является довольно агрессивным для всех, кто сталкивался с этим вопросом, дополняется тем фактом, что вы не даете никаких ссылок из своего собственного примера и не описываете какую-либо наблюдаемую неисправность, что было причиной понижения. В конце концов, вы в конечном итоге говорите то же самое, что и в других ответах: проведите тесты дыма в своей системе инициализации, чтобы убедиться, что система в порядке, а большинство систем терпят неудачу, если не могут объединить систему в требуемом состоянии. Что касается вашего редактирования, то обычно слияние выполняется после развертывания на стадии и обеспечения прохождения тестов на дым ...
Tensibai
Я определенно не собирался быть агрессивным, я не использую здесь свой родной язык (это очевидно, я думаю :)).
Пирс
Мы можем обсудить это в чате DevOps, если хотите, я думаю, что видел эту презентацию или такую, как она, на мероприятии devoxx несколько лет назад. Я немного не согласен с вызовом этого модульного теста, это скорее функциональные тесты.
Тенсибай
Кто-то из моей команды разработчиков сказал мне то же самое, что это был не модульный тест, я не разработчик, поэтому я могу ошибаться, называя этот модульный тест, определенно
Pier
1

По моему опыту, одно из главных различий между Dev и Ops - это «сильные зависимости времени выполнения». Установка пакетов в значительной степени зависит от репозиториев, сетей или допустимых ключей, или, скажем, создания нового облачного сервера - это зависит от ресурсов вашего провайдера.

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

Если вы перейдете на отдельные серверы, все станет еще хуже ... как вы будете тестировать достижимость во всей сети? В том числе DNS-разрешение, маршрутизация и межсетевой экран? Даже если API вашего провайдера IaaC работает должным образом (я видел проблемы с проводной связью в этой области), мне действительно нравится TDD в этом случае.

Поскольку я не нашел никаких инструментов тестирования в этой области, мы написали один в свободное время: https://github.com/DomainDrivenArchitecture/dda-serverspec-crate

Поэтому я считаю, что TDD действительно важен в мире DevOps!

Джергер
источник