Тестирование — Как Протестировать Конфигурацию Terraform?

  • Автор темы Klojihurf5
  • Обновлено
  • 22, Oct 2024
  • #1

Если бы у вас был Терраформировать конфигурации средней степени сложности, как бы вы написали тесты для конфигурации, которые можно было бы выполнить как часть конвейера непрерывной интеграции/непрерывной доставки?

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

  • Службы контейнеров Azure для размещения Docker в Azure
  • Хранилище BLOB-объектов Azure
  • SQL Azure
  • Служба контейнеров EC2 для размещения Docker в AWS
  • Служба хранения Amazon S3
  • База данных SQL-сервера Amazon RDS

Потенциально terraform apply could create the above from scratch, or transition from a partially deployed state to the above desired state.

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

#тестирование #terraform

Klojihurf5


Рег
17 May, 2020

Тем
86

Постов
223

Баллов
683
  • 25, Oct 2024
  • #2

В настоящее время не существует полного решения этой проблемы, интегрированного в Terraform, но есть некоторые строительные блоки, которые могут быть полезны при написании тестов на отдельном языке программирования.

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

Какая стратегия здесь подойдет, во многом будет зависеть от того, что именно вы хотите протестировать. Например:

  • В среде, в которой раскручиваются виртуальные серверы, такие инструменты, как Спецификация сервера может использоваться для запуска тестов с точки зрения этих серверов. Это можно запустить отдельно от Terraform, используя какой-либо внешний процесс, или как часть приложения Terraform, используя команду

     
     
     
     
     Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
    
    Outputs:
    
    expect-1 = TRUE
    expect-other = FALSE. Got 1
     
    provisioner. Это позволяет проверять такие вопросы, как «может ли сервер получить доступ к базе данных?», но не подходит для таких вопросов, как «достаточно ли ограничительна группа безопасности экземпляра?», поскольку надежная проверка требует доступа к данным извне самого экземпляра.

  • Можно писать тесты, используя существующую среду тестирования (например, RSpec для Ruby, terraform init terraform apply -auto-approve for Python, etc) which gather relevant resource ids or addresses from the Terraform state file and then use the relevant platform's SDK to retrieve data about the resources and assert that they are set up as expected. This is a more general form of the previous idea, running the tests from the perspective of a host снаружи тестируемой инфраструктуры и, таким образом, может собирать более широкий набор данных для вынесения предположений.

  • Для более скромных нужд можно довериться тому, что состояние Terraform является точным представлением реальности (во многих случаях допустимое предположение), и просто утверждать это непосредственно. Это наиболее подходит для простых случаев, подобных lint, таких как проверка того, что правильная схема маркировки ресурсов соблюдается в целях распределения затрат.

Есть еще обсуждение этого вопроса в соответствующая проблема Terraform Github.

В последних версиях Terraform настоятельно рекомендуется использовать удаленный бэкэнд для любого неигрового приложения, но это означает, что данные о состоянии не доступны напрямую на локальном диске. Однако его снимок можно получить с удаленного сервера с помощью команды output "module-returns-1" { value = 1 } command, which prints the JSON-formatted state data to stdout so it can be captured and parsed by a calling program.

 

Silvercleric


Рег
22 May, 2006

Тем
77

Постов
182

Баллов
607
  • 25, Oct 2024
  • #3

Недавно мы открыли исходный код Терратест, наш швейцарский армейский нож для тестирования кода инфраструктуры.

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

  1. Пишите тесты на Go.
  2. Используйте помощники в Terratest для запуска реальных инструментов IaC (например, Terraform, Packer и т. д.) для развертывания реальной инфраструктуры (например, серверов) в реальной среде (например, AWS).
  3. Используйте помощники в Terratest, чтобы проверить правильность работы инфраструктуры в этой среде, выполняя HTTP-запросы, вызовы API, SSH-соединения и т. д.
  4. Используйте помощники в Terratest, чтобы отменить развертывание всего в конце теста.

Вот пример теста для некоторого кода Terraform:

terraform { required_version = ">= 0.12" } module "simple_module" { source = "./simple_module" } locals { expected = 1 got = module.simple_module.module-returns-1 } # Test Output output "expect-1" { value = upper(local.expected == local.got) } output "expect-other" { value = "other" == local.got ? upper(true) : "FALSE. Got ${local.got}" }

Это интеграционные тесты, и в зависимости от того, что вы тестируете, они могут занять 5–50 минут. Это не быстро (хотя при использовании Докер и этапы испытаний, ты можешь ускориться некоторый все в порядке), и вам придется поработать, чтобы сделать тесты надежными, но это того стоит.

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

 

Klim_2006


Рег
01 Dec, 2006

Тем
68

Постов
184

Баллов
554
  • 25, Oct 2024
  • #4

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

 

Nikitos2000


Рег
08 Dec, 2013

Тем
75

Постов
183

Баллов
608
  • 25, Oct 2024
  • #5

В дополнение ко всем остальным упомянутым опциям я хотел бы упомянуть, что в InSpec 2.0 добавлена ​​поддержка API-интерфейсов облачных провайдеров. По сути, вы можете продолжить написание IaC с помощью Terraform, а затем написать проверки соответствия с помощью InSpec для своих облачных ресурсов. Кроме того, InSpec поддерживает написание тестов для отдельных машин, если вам это когда-нибудь понадобится.

Вот статья Кристофа Хартмана (соавтора Inspec) о том, как использовать Inspec с Terraform: https://lollyrock.com/articles/inspec-terraform/

 

Reitphese


Рег
25 Dec, 2010

Тем
70

Постов
198

Баллов
548
  • 25, Oct 2024
  • #6

На Aws-Side есть https://github.com/k1LoW/awspec - должна быть возможность ввести terraform.state и проверить, правильно ли применен terraform.

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

Мы обсуждаем эту идею здесь:

https://github.com/DomainDrivenArchitecture/dda-cloudspec/blob/development/README.md

Для предварительного тестирования инвариантов я не знаю готового решения...

Мы провели несколько экспериментов, используя смесь simple_module/outputs.tf and main.tf из-за отсутствия названий элементов. Здесь обсуждается более доступный формат плана: github.com/hashicorp/terraform/issues/11883.

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

 

Чипполино


Рег
18 Jan, 2012

Тем
66

Постов
176

Баллов
546
  • 25, Oct 2024
  • #7

Я видел этот элегантный и простой метод тестирования Terraform, предложенный очевидно, умный в ветке проблем GitHub. Это подходит не для каждой ситуации, но отлично подходит для проверки логики модуля.

Создайте корневой модуль, включающий тестируемый модуль и проверяющий тестируемые выходные данные. Вот простой пример использования двух файлов:

  • grep that will run the tests
  • terraform plan -out=plan.dump that represents a module under test

./main.tf

terraformOptions := &terraform.Options { // The path to where your Terraform code is located TerraformDir: "../examples/terraform-basic-example", } // This will run `terraform init` and `terraform apply` and fail the test if there are any errors terraform.InitAndApply(t, terraformOptions) // At the end of the test, run `terraform destroy` to clean up any resources that were created defer terraform.Destroy(t, terraformOptions) // Run `terraform output` to get the value of an output variable instanceUrl := terraform.Output(t, terraformOptions, "instance_url") // Verify that we get back a 200 OK with the expected text // It can take a minute or so for the Instance to boot up, so retry a few times expected := "Hello, World" maxRetries := 15 timeBetweenRetries := 5 * time.Second http_helper.HttpGetWithRetry(t, instanceUrl, 200, expected, maxRetries, timeBetweenRetries)

./simple_module/outputs.tf

terraform state pull

Запустите тесты

unittest remote-exec
 

Lkzqmbtmy46


Рег
28 Aug, 2012

Тем
79

Постов
197

Баллов
632
Похожие темы Дата
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно