Làm cách nào để kiểm tra Cấu hình Terraform?


37

Nếu bạn có cấu hình Terraform có độ phức tạp vừa phải, bạn sẽ viết các bài kiểm tra xung quanh cấu hình có thể được thực thi như một phần của đường ống Tích hợp liên tục / Phân phối liên tục như thế nào?

Ví dụ: bạn có thể có cấu hình nhiều đám mây chỉ định trạng thái mong muốn sau:

  • Dịch vụ container Azure để lưu trữ Docker trong Azure
  • Lưu trữ Azure Blob
  • SQL Azure
  • Dịch vụ container EC2 để lưu trữ Docker trong AWS
  • Dịch vụ lưu trữ Amazon S3
  • Cơ sở dữ liệu máy chủ SQL RDS của Amazon

Có khả năng terraform applycó thể tạo ở trên từ đầu hoặc chuyển từ trạng thái được triển khai một phần sang trạng thái mong muốn ở trên.

Tôi biết rằng Terraform phân chia công việc của mình thành giai đoạn kế hoạch thực hiện và giai đoạn ứng dụng thực sự tạo ra thay đổi cho kiến ​​trúc đích. Điều này có thể được sử dụng để viết các bài kiểm tra đối với kế hoạch thực hiện không, nếu có thì có các khung để giúp viết các bài kiểm tra này không?



Thật thú vị, có thể trả lời xứng đáng.
Richard Slater

Bản thân tôi không sử dụng terraform, vì vậy tôi đã để một người có kinh nghiệm thực sự viết câu trả lời :)
Tensibai

Câu trả lời:


20

Hiện tại không có giải pháp đầy đủ cho việc này được tích hợp vào Terraform, nhưng có một số khối xây dựng có thể hữu ích để hỗ trợ viết bài kiểm tra bằng ngôn ngữ lập trình riêng biệt.

Terraform tạo các tệp trạng thái ở định dạng JSON, về nguyên tắc, có thể được sử dụng bởi các chương trình bên ngoài để trích xuất dữ liệu nhất định về những gì mà Terraform tạo ra. Mặc dù định dạng này chưa được coi là chính thức ổn định, nhưng trên thực tế, nó thay đổi không thường xuyên đến mức mọi người đã tích hợp thành công với nó, chấp nhận rằng họ có thể cần phải điều chỉnh khi nâng cấp Terraform.

Chiến lược nào phù hợp ở đây sẽ phụ thuộc rất nhiều vào chính xác những gì bạn muốn thử nghiệm. Ví dụ:

  • Trong một môi trường làm quay vòng các máy chủ ảo, các công cụ như Serverspec có thể được sử dụng để chạy thử nghiệm từ quan điểm của các máy chủ này. Điều này có thể được chạy riêng với Terraform bằng cách sử dụng một số quy trình ngoài băng hoặc là một phần của ứng dụng Terraform sử dụng nhà remote-execcung cấp . Điều này cho phép xác minh các câu hỏi như "máy chủ có thể truy cập cơ sở dữ liệu không?", Nhưng không phù hợp với các câu hỏi như "nhóm bảo mật của cá thể có đủ hạn chế không?", Vì việc kiểm tra mạnh mẽ yêu cầu truy cập dữ liệu từ bên ngoài cá thể.

  • Có thể viết các bài kiểm tra bằng cách sử dụng khung kiểm tra hiện có (như RSpec cho Ruby, unittestcho Python, v.v.) để thu thập các id hoặc địa chỉ tài nguyên có liên quan từ tệp trạng thái Terraform và sau đó sử dụng SDK của nền tảng có liên quan để lấy dữ liệu về tài nguyên và khẳng định rằng chúng được thiết lập như mong đợi. Đây là một hình thức tổng quát hơn của ý tưởng trước đó, chạy thử nghiệm từ quan điểm của máy chủ bên ngoài cơ sở hạ tầng đang thử nghiệm và do đó có thể thu thập một tập hợp dữ liệu rộng hơn để đưa ra các xác nhận.

  • Đối với các nhu cầu khiêm tốn hơn, người ta có thể chọn tin tưởng rằng trạng thái Terraform là một đại diện chính xác của thực tế (một giả định hợp lệ trong nhiều trường hợp) và chỉ cần xác nhận trực tiếp về điều đó. Điều này là thích hợp nhất cho các trường hợp "giống như lint" đơn giản, chẳng hạn như xác minh rằng chương trình gắn thẻ tài nguyên chính xác đang được tuân theo cho các mục đích phân bổ chi phí.

Có một số thảo luận thêm về vấn đề này trong một vấn đề liên quan đến Terraform Github .

Trong các phiên bản mới nhất của Terraform, chúng tôi khuyên bạn nên sử dụng phụ trợ từ xa cho bất kỳ ứng dụng phi đồ chơi nào, nhưng điều đó có nghĩa là dữ liệu trạng thái không có sẵn trực tiếp trên đĩa cục bộ. Tuy nhiên, ảnh chụp nhanh của nó có thể được truy xuất từ ​​phụ trợ từ xa bằng cách sử dụng terraform state pulllệnh, in dữ liệu trạng thái được định dạng JSON thành thiết bị xuất chuẩn để có thể được chụp và phân tích cú pháp bởi một chương trình gọi.


12

Là một bản cập nhật cho câu hỏi này, hiện đã có Kitchen-Terraform cho phép thử nghiệm các tệp Cấu hình Terraform mà không phá vỡ môi trường sản xuất. Kho lưu trữ cũng bao gồm một vài ví dụ cho các nhà cung cấp khác nhau của Terraform.


12

Gần đây chúng tôi đã mở Terratest , con dao quân đội Thụy Sĩ của chúng tôi để thử nghiệm mã cơ sở hạ tầng.

Hôm nay, có lẽ bạn đang kiểm tra tất cả mã cơ sở hạ tầng của mình theo cách thủ công bằng cách triển khai, xác thực và không triển khai. Terratest giúp bạn tự động hóa quá trình này:

  1. Viết bài kiểm tra trong Go.
  2. Sử dụng các trình trợ giúp trong Terratest để thực thi các công cụ IaC thực sự của bạn (ví dụ: Terraform, Packer, v.v.) để triển khai cơ sở hạ tầng thực (ví dụ: máy chủ) trong môi trường thực (ví dụ: AWS).
  3. Sử dụng các trình trợ giúp trong Terratest để xác thực rằng cơ sở hạ tầng hoạt động chính xác trong môi trường đó bằng cách thực hiện các yêu cầu HTTP, các lệnh gọi API, kết nối SSH, v.v.
  4. Sử dụng người trợ giúp trong Terratest để triển khai mọi thứ vào cuối bài kiểm tra.

Dưới đây là một thử nghiệm ví dụ cho một số mã Terraform:

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)

Đây là các thử nghiệm tích hợp và tùy thuộc vào những gì bạn đang thử nghiệm, có thể mất 5 - 50 phút. Nó không nhanh (mặc dù sử dụng Dockercác giai đoạn thử nghiệm , bạn có thể tăng tốc một số thứ) và bạn sẽ phải làm việc để làm cho các bài kiểm tra đáng tin cậy, nhưng nó rất đáng thời gian.

Kiểm tra repo Terratest cho các tài liệu và rất nhiều ví dụ về các loại mã cơ sở hạ tầng khác nhau và các thử nghiệm tương ứng cho chúng.


1
Tôi cũng đã viết một bài đăng trên blog để kiểm tra một trong những dự án ví dụ của tôi với Terratest chi tiết hơn: sángfame.co / blog / giả . Nó có thể có giá trị với bất cứ ai. Chúc mừng, Rob!
Rob Morgan

Fan hâm mộ lớn của Terratest!
jlucktay

7

Ngoài tất cả các tùy chọn khác được đề cập, tôi muốn đề cập rằng InSpec 2.0 đã thêm hỗ trợ cho API của nhà cung cấp đám mây. Về cơ bản, bạn có thể tiếp tục viết IaC bằng Terraform, sau đó viết kiểm tra tuân thủ với InSpec cho tài nguyên đám mây của bạn. Ngoài ra, InSpec hỗ trợ kiểm tra viết cho các máy riêng lẻ nếu bạn cần.

Dưới đây là một bài viết từ Christoph Hartmann (đồng sáng lập Inspec) về cách sử dụng Inspec với Terraform: https://lollyrock.com/articles/inspec-terraform/


5

Trên Aws-Side có https://github.com/k1LoW/awspec - điều đó là có thể, để cung cấp trong terraform.state và thử nghiệm, áp dụng terraform đúng.

Nhưng tôi nghĩ, ngoài việc thử nghiệm ở mức độ thấp công cụ, bạn đã sử dụng, có lẽ là một ý tưởng tốt hơn, để suy nghĩ về cách kiểm tra toàn bộ cơ sở hạ tầng.

Chúng ta đang thảo luận xung quanh ý tưởng này ở đây:

https://github.com/DomainDrivenArch architecture / dda-cloudspec / blog / phát triển / ROADME.md

Để thử nghiệm bất biến trả trước, tôi không biết một giải pháp sẵn sàng để sử dụng ...

Chúng tôi đã thực hiện một số thí nghiệm bằng cách sử dụng kết hợp terraform plan -out=plan.dumpgrepkhông có tên thành phần. Có một cuộc thảo luận về một định dạng kế hoạch dễ tiếp cận hơn ở đây: github.com/hashicorp/terraform/issues/11883

Nhưng hiện tại chúng tôi đang sử dụng quy trình xem xét kế hoạch thủ công cho các phần quan trọng của cơ sở hạ tầng.


4
Mục tiêu là để kiểm tra các thay đổi trong cấu hình terraform sẽ không phá vỡ các nhu cầu dự kiến, một khi đã triển khai thì quá muộn, tốt nhất là bạn không thấy DB bị xóa ở nơi không nên, nhưng bạn đã phá vỡ môi trường đích. .. câu hỏi là về việc kiểm tra mã terraform, không kiểm tra kết quả cuối cùng, kiểm tra đơn vị so với kiểm tra tích hợp.
Tensibai

điểm tốt ... đã thêm một phần để kiểm tra bất biến.
Jerger

0

Tôi đã thấy phương pháp công nghệ thấp, thanh lịch này để kiểm tra Terraform được đề xuất bởi Rõ ràng trong một vấn đề của GitHub. Nó không phù hợp với mọi tình huống nhưng thật tuyệt vời khi xác minh logic mô-đun.

Tạo một mô-đun gốc bao gồm các mô-đun được thử nghiệm và xác minh các đầu ra dưới thử nghiệm. Đây là một ví dụ đơn giản sử dụng hai tệp:

  • main.tf sẽ chạy thử nghiệm
  • simple_module/outputs.tf đại diện cho một mô-đun đang thử nghiệm

./main.tf

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}"
}

./simple_module/outputs.tf

output "module-returns-1" {
  value = 1
}

Chạy thử nghiệm

terraform init
terraform apply -auto-approve
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

expect-1 = TRUE
expect-other = FALSE. Got 1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.