Если бы у вас была конфигурация Terraform, которая имела умеренную степень сложности, как бы вы написали тесты для конфигурации, которые могли бы выполняться как часть конвейера Continuous Integration / Continuous Delivery?
Например, у вас может быть конфигурация с несколькими облаками, которая задает следующее желаемое состояние:
- Службы контейнеров Azure для размещения Docker в Azure
- Хранилище BLOB-объектов Azure
- SQL Azure
- Контейнерный сервис EC2 для размещения Docker в AWS
- Сервис хранения Amazon S3
- База данных Amazon RDS SQL Server
Потенциально terraform apply
может создать вышеуказанное с нуля или перейти из частично развернутого состояния в указанное выше желаемое состояние.
Мне известно, что Terraform разделяет свою работу на этап плана выполнения и этап приложения, который фактически вносит изменения в целевую архитектуру. Может ли это быть использовано для написания тестов по плану выполнения, если да, существуют ли фреймворки, помогающие их написать?
Ответы:
В настоящее время нет полного решения для этой интеграции в Terraform, но есть некоторые строительные блоки, которые могут быть полезны при написании тестов на отдельном языке программирования.
Terraform создает файлы состояний в формате JSON, которые, в принципе, могут использоваться внешними программами для извлечения определенных данных о том, что создал Terraform. Хотя этот формат еще не считается официально стабильным, на практике он меняется достаточно редко, чтобы люди успешно интегрировались с ним, признавая, что им может потребоваться внести изменения при обновлении Terraform.
Какая стратегия здесь подходит, во многом будет зависеть от того, что именно вы хотите проверить. Например:
В среде, которая раскручивает виртуальные серверы, такие инструменты, как Serverspec, могут использоваться для запуска тестов с точки зрения этих серверов. Это может быть либо запущено отдельно от Terraform с использованием какого-либо внеполосного процесса, либо как часть Terraform, применяемая с использованием
remote-exec
провайдера . Это позволяет проверять вопросы типа «может ли сервер связаться с базой данных?», Но не подходит для таких вопросов, как «достаточно ли ограничена группа безопасности экземпляра?», Поскольку надежная проверка требует доступа к данным извне самого экземпляра.Можно написать тесты с использованием существующей тестовой среды (такой как RSpec для Ruby,
unittest
для Python и т. Д.), Которая собирает соответствующие идентификаторы ресурсов или адреса из файла состояния Terraform, а затем использует SDK соответствующей платформы для получения данных о ресурсах и утверждает, что они настроены как ожидалось. Это более общая форма предыдущей идеи, когда тесты выполняются с точки зрения хоста за пределами тестируемой инфраструктуры, и, таким образом, они могут собирать более широкий набор данных для утверждения.При более скромных потребностях можно полагать, что состояние Terraform является точным представлением реальности (во многих случаях допустимым предположением), и просто утверждать непосредственно об этом. Это наиболее подходит для простых «похожих на ворсин» случаев, таких как проверка того, что для целей распределения затрат используется правильная схема маркировки ресурсов.
Это обсуждается в соответствующем выпуске Terraform Github .
В последних версиях Terraform настоятельно рекомендуется использовать удаленный бэкэнд для любого не игрушечного приложения, но это означает, что данные о состоянии не доступны напрямую на локальном диске. Однако его снимок может быть получен из удаленного бэкэнда с помощью
terraform state pull
команды, которая печатает данные состояния в формате JSON в стандартный вывод, чтобы их можно было захватить и проанализировать вызывающей программой.источник
В качестве обновления к этому вопросу теперь есть Kitchen-Terraform, которая позволяет тестировать файлы конфигурации Terraform, не нарушая рабочих сред. Хранилище также включает в себя несколько примеров для разных поставщиков Terraform.
источник
Недавно мы открыли исходный код Terratest , нашего швейцарского армейского ножа для тестирования кода инфраструктуры.
Сегодня вы, вероятно, тестируете весь код своей инфраструктуры вручную, развертывая, проверяя и отменяя развертывание. Terratest помогает вам автоматизировать этот процесс:
Вот пример теста для некоторого кода Terraform:
Это интеграционные тесты, и в зависимости от того, что вы тестируете, это может занять 5 - 50 минут. Это не быстро (хотя, используя Docker и этапы тестирования , вы можете ускорить некоторые вещи), и вам придется потрудиться, чтобы сделать тесты надежными, но это того стоит.
В репозитории Terratest вы найдете документы и множество примеров различных типов кода инфраструктуры и соответствующих тестов для них.
источник
В дополнение ко всем другим упомянутым опциям я хотел бы отметить, что в InSpec 2.0 добавлена поддержка API-интерфейсов облачного провайдера. По сути, вы можете продолжить писать IaC с помощью Terraform, а затем писать проверки совместимости с InSpec для своих облачных ресурсов. Кроме того, InSpec поддерживает написание тестов для отдельных машин, если вам это когда-нибудь понадобится.
Вот статья Кристофа Хартманна (со-создателя Inspec) о том, как использовать Inspec с Terraform: https://lollyrock.com/articles/inspec-terraform/
источник
На Aws-Side есть https://github.com/k1LoW/awspec - должна быть возможность, подать в terraform.state и проверить, правильно ли применен terraform.
Но я думаю, что помимо тестирования на низкоуровневом инструменте, который вы использовали, возможно, лучше подумать о том, как тестировать целые инфраструктуры.
Мы обсуждаем эту идею здесь:
https://github.com/DomainDrivenArchitecture/dda-cloudspec/blob/development/README.md
Для тестирования инвариантов заранее, я не знаю готового решения ...
Мы провели несколько экспериментов, используя комбинацию
terraform plan -out=plan.dump
иgrep
отсутствие названий элементов. Здесь обсуждается более доступный формат плана: github.com/hashicorp/terraform/issues/11883Но в данный момент мы используем процесс проверки планов вручную для важных частей нашей инфраструктуры.
источник
Я видел этот элегантный, низкотехнологичный метод тестирования Terraform, предложенный, по- видимому, smartmart в ветке выпуска GitHub. Это не подходит для каждой ситуации, но отлично подходит для проверки логики модуля.
Создайте корневой модуль, который включает тестируемый модуль и проверяет результаты тестируемого теста. Вот простой пример использования двух файлов:
main.tf
что будет запускать тестыsimple_module/outputs.tf
представляющий тестируемый модуль./main.tf
./simple_module/outputs.tf
Запустите тесты
источник