如何测试terraform模板而不是反复试验
我正在使用Terraform创建云资源。在资源调配之后,每个资源都应处于特定的期望状态。例如,当我创建一个Google Cloud Bucket时,我希望自动应用某些权限。所以,我的计划包含了这方面的必要代码,但我想确保在我申请之前,无论什么时候,这都是有效的。是否有任何测试工具/库可以提供帮助?terraform plan命令旨在预览应用该计划时terraform将进行哪些更改,这是我们在不接触“真实”API的情况下最接近测试terraform配置的方法 对于这还不够的情况,通常会使用不同的状态多次部署同一配置,从而允许将一个配置用作“暂存”环境来测试更改,而不会影响主环境。Terraform 0.9中添加的功能可以简化此过程,因为可以使用Terraform CLI命令直接管理多个环境状态 当涉及到结果的自动测试时,目前还没有集成到Terraform中的完整解决方案,但是有一些构建块可以帮助用单独的编程语言编写测试 Terraform以JSON格式生成状态文件,原则上,外部程序可以使用这些文件提取有关Terraform创建内容的特定数据。虽然这种格式尚未被官方认为是稳定的,但实际上它的变化频率很低,以至于人们已经成功地与之集成,并接受在升级Terraform时可能需要进行调整 在这里什么策略是合适的将在很大程度上取决于您到底想要测试什么。例如:如何测试terraform模板而不是反复试验,terraform,Terraform,我正在使用Terraform创建云资源。在资源调配之后,每个资源都应处于特定的期望状态。例如,当我创建一个Google Cloud Bucket时,我希望自动应用某些权限。所以,我的计划包含了这方面的必要代码,但我想确保在我申请之前,无论什么时候,这都是有效的。是否有任何测试工具/库可以提供帮助?terraform plan命令旨在预览应用该计划时terraform将进行哪些更改,这是我们在不接触“真实”API的情况下最接近测试terraform配置的方法 对于这还不够的情况,通常会使用不同的状
- 在虚拟服务器高速运转的环境中,可以从这些服务器的角度使用类似的工具来运行测试。这可以使用一些带外过程与Terraform分开运行,也可以作为Terraform应用的一部分使用。这允许验证诸如“服务器能否到达数据库?”之类的问题,但不适用于诸如“实例的安全组限制是否足够?”之类的问题,因为需要从实例本身外部访问数据的稳健检查
- 可以使用现有的测试框架(如Ruby的RSpec、Python的unittest等)编写测试,这些框架从Terraform状态文件中收集相关的资源ID或地址,然后使用相关平台的SDK检索有关资源的数据,并断言这些资源是按预期设置的。这是前面想法的一种更一般的形式,从被测基础设施之外的主机的角度运行测试,因此可以收集更广泛的数据集来进行断言
- 对于更温和的需求,人们可以选择相信地形状态是现实的准确代表(在许多情况下这是一个有效的假设),并直接断言这一点。这最适合于简单的“lint-like”情况,例如验证是否遵循了正确的资源标记方案以进行成本分配
在Terraform的最新版本中,强烈建议对任何非toy应用程序使用远程后端,但这意味着状态数据不能直接在本地磁盘上使用。但是,可以使用
terraform state pull
命令从远程后端检索它的快照,该命令将JSON格式的状态数据打印到stdout,以便调用程序捕获和解析它。是的,我以前也有同样的想法。目前,当我应用新的地形变化时,我使用几种方法来降低风险
他们不能保证terraform应用100%成功,但会在应用之前解决大多数问题
validate() {
modules=$(find . -type f -name "*.tf" -exec dirname {} \;|sort -u)
for m in ${modules}
do
(terraform validate "$m" && echo "√ $m") || exit 1
done
}
当然,在您提交更改之前,请先执行地形fmt
@Martin Atkins已经对此进行了解释,并提供了有关此命令的详细信息
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)
这些是集成测试,根据您正在测试的内容,可能需要5-50分钟。它不快(虽然使用和可以加快一些速度),而且您必须努力使测试可靠,但这是值得的