Инфраструктура как код подсказывает нам использовать инструменты, которые автоматизируют ваши сборки. Отлично. Такие инструменты, как ansible , chef , puppet , salt stack и другие, подталкивают нас к написанию того, как выглядит инфраструктура, при устранении различий.
В соляном стеке эти биты называются состояниями . Если состояние не соответствует действительности, инструмент разрешит его для нас. Другими словами - мы пишем тест для нашей инфраструктуры, и если тест не пройден, инструмент исправит его самостоятельно. По крайней мере, это идея.
XP учит нас использовать TDD, и вопрос в том, применимо ли это к инфраструктуре? Инструменты предполагают, что это так.
Я могу представить несколько типов тестов, которые могут быть очень полезными.
Мы пишем дымовые тесты, которые связаны с развернутой службой, чтобы гарантировать, что развернутая служба работает и работает должным образом. Это будет вызов API или проверка systemctl, чтобы убедиться, что то, что мы только что развернули, работает. Большая часть этой функциональности может быть реализована в одних и тех же состояниях, поскольку такие инструменты, как ansible, имеют состояния, обеспечивающие работу службы.
Существует проект Molecule, который позволяет запускать отдельные роли (так как ansible называет их состояния) для докера или другого временного механизма виртуализации. Это заставляет разъединять роли и позволяет выполнять их изолированно от сборника пьес при работе с ними. Тесты в основном позволяют проверять переменные, с которыми должна работать роль. Другие примеры выглядят как дублирование ANSIBLE движка (утверждают, что файл принадлежит пользователю ...).
ThoughtWorks тек радар прямо сейчас хвалит инструменты , такие как Inspec , serverspec или Госс для проверки того, что сервер соответствует спецификации. Но мы пишем спецификацию, не так ли?
Так есть ли смысл в дальнейшем тестировании инфраструктуры, если мы описываем инфраструктуру в состояниях / ролях? Я мог бы подозревать, что это становится более необходимым в более крупных организациях, где одна команда предоставляет спецификацию, а другая следует, или, если существует большой набор ролей, может быть, вы хотите запустить их подмножество и получить выгоду от тестов? Я изо всех сил пытаюсь понять, почему вы написали бы тест, если бы вы могли иметь роль / состояние для того же вопроса.
goss
. Так, например, RPM установлен (отвечающий) и затем проверяется, установлен ли ожидаемый файл по умолчанию или служба запущена и прослушивает определенный порт. Я не хочу, чтобы исправить эту проблему автоматически, но получать уведомления и остановить прогресс. Конечно, Ansible также может протестировать систему для вас, вам просто нужноgoss
ИМХО, довольно избыточно писать тесты TDD для элементов, полностью охватываемых спецификацией состояния IaaC. Это подразумевает, что эффективность IaaC сомнительна - зачем вам его использовать, если так?
Глядя на это с другой точки зрения, сам IaaC (если / когда все сделано правильно) включает в себя возможности, уже проверенные и считающиеся надежно работающими. Что делает его привлекательным и делает излишним написание тестов на соответствие TDD.
Например, конфигурация IaaC, определяющая систему с установленным SSH, уже включает в себя надежную проверку правильности установки SSH и, если нет, механизмы для его правильной установки. Что делает тест TDD для проверки, установлен ли SSH, избыточным. Если ваша конфигурация IaaC также указывает, что sshd должен быть запущен и прослушивать определенный порт, тогда тесты TDD для запуска sshd и прослушивания соответствующего порта также будут излишними.
Обратите внимание, что мой ответ не нацелен на TDD или какой-либо другой тип тестирования, который проверяет, соответствует ли ваша конфигурация IaaC в целом определенной цели. Это остается в силе и может использоваться при проверках TDD, CI или аналогичных при разработке этой спецификации IaaC - я считаю, что ответ @ AnoE применим в таком случае.
источник
Похоже, что все здесь предполагают, что инструмент IAC всегда работает так, как ожидалось, но я могу сказать (из моего собственного опыта), что это не всегда так, в противном случае модульное тестирование будет фактически бесполезным.
Я помню картинку с надписью «Запустил сборник пьес, все хорошо», а на заднем плане горело здание ...
Запуск декларативного состояния и наличие сервера в этом фактическом объявленном состоянии - это две разные вещи с моей точки зрения и опыта, по крайней мере.
Широкая и неоднородная среда, распределенная по нескольким DC, доступная через общедоступную сеть и т. Д. Есть несколько причин, по которым состояние не может быть применено, полностью или частично.
По всем этим причинам есть место для модульного тестирования, позволяющего получить снимок фактического состояния сервера, который, опять же, может отличаться от целевого состояния.
Поэтому я бы сказал, да, модульное тестирование полезно даже в управляемой IAC среде.
РЕДАКТИРОВАТЬ
Как насчет нерегрессионной стороны ветви dev базы кода IaC? чтобы вы вносили изменения в свой код в ветке dev и объединяли его с веткой prod, надеясь не сломать все? модульное тестирование настолько ценно и обычно просто в реализации, что я не понимаю, почему можно было бы написать код без этой функции.
Ссылка (на французском извините за это): https://fr.slideshare.net/logilab/testinfra-pyconfr-2017
источник
По моему опыту, одно из главных различий между Dev и Ops - это «сильные зависимости времени выполнения». Установка пакетов в значительной степени зависит от репозиториев, сетей или допустимых ключей, или, скажем, создания нового облачного сервера - это зависит от ресурсов вашего провайдера.
С точки зрения обеспечения сервера, даже если вы не изменили свой код предоставления, ваше изображение будет действительным в большинстве случаев, но иногда нет. Поэтому я считаю, что тестирование действительно важно для предоставления рабочих изображений.
Если вы перейдете на отдельные серверы, все станет еще хуже ... как вы будете тестировать достижимость во всей сети? В том числе DNS-разрешение, маршрутизация и межсетевой экран? Даже если API вашего провайдера IaaC работает должным образом (я видел проблемы с проводной связью в этой области), мне действительно нравится TDD в этом случае.
Поскольку я не нашел никаких инструментов тестирования в этой области, мы написали один в свободное время: https://github.com/DomainDrivenArchitecture/dda-serverspec-crate
Поэтому я считаю, что TDD действительно важен в мире DevOps!
источник