Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何测试terraform模板而不是反复试验_Terraform - Fatal编程技术网

如何测试terraform模板而不是反复试验

如何测试terraform模板而不是反复试验,terraform,Terraform,我正在使用Terraform创建云资源。在资源调配之后,每个资源都应处于特定的期望状态。例如,当我创建一个Google Cloud Bucket时,我希望自动应用某些权限。所以,我的计划包含了这方面的必要代码,但我想确保在我申请之前,无论什么时候,这都是有效的。是否有任何测试工具/库可以提供帮助?terraform plan命令旨在预览应用该计划时terraform将进行哪些更改,这是我们在不接触“真实”API的情况下最接近测试terraform配置的方法 对于这还不够的情况,通常会使用不同的状

我正在使用Terraform创建云资源。在资源调配之后,每个资源都应处于特定的期望状态。例如,当我创建一个Google Cloud Bucket时,我希望自动应用某些权限。所以,我的计划包含了这方面的必要代码,但我想确保在我申请之前,无论什么时候,这都是有效的。是否有任何测试工具/库可以提供帮助?

terraform plan命令旨在预览应用该计划时terraform将进行哪些更改,这是我们在不接触“真实”API的情况下最接近测试terraform配置的方法

对于这还不够的情况,通常会使用不同的状态多次部署同一配置,从而允许将一个配置用作“暂存”环境来测试更改,而不会影响主环境。Terraform 0.9中添加的功能可以简化此过程,因为可以使用Terraform CLI命令直接管理多个环境状态

当涉及到结果的自动测试时,目前还没有集成到Terraform中的完整解决方案,但是有一些构建块可以帮助用单独的编程语言编写测试

Terraform以JSON格式生成状态文件,原则上,外部程序可以使用这些文件提取有关Terraform创建内容的特定数据。虽然这种格式尚未被官方认为是稳定的,但实际上它的变化频率很低,以至于人们已经成功地与之集成,并接受在升级Terraform时可能需要进行调整

在这里什么策略是合适的将在很大程度上取决于您到底想要测试什么。例如:

  • 在虚拟服务器高速运转的环境中,可以从这些服务器的角度使用类似的工具来运行测试。这可以使用一些带外过程与Terraform分开运行,也可以作为Terraform应用的一部分使用。这允许验证诸如“服务器能否到达数据库?”之类的问题,但不适用于诸如“实例的安全组限制是否足够?”之类的问题,因为需要从实例本身外部访问数据的稳健检查

  • 可以使用现有的测试框架(如Ruby的RSpec、Python的unittest等)编写测试,这些框架从Terraform状态文件中收集相关的资源ID或地址,然后使用相关平台的SDK检索有关资源的数据,并断言这些资源是按预期设置的。这是前面想法的一种更一般的形式,从被测基础设施之外的主机的角度运行测试,因此可以收集更广泛的数据集来进行断言

  • 对于更温和的需求,人们可以选择相信地形状态是现实的准确代表(在许多情况下这是一个有效的假设),并直接断言这一点。这最适合于简单的“lint-like”情况,例如验证是否遵循了正确的资源标记方案以进行成本分配

关于这一点,在本文中还有更多的讨论


在Terraform的最新版本中,强烈建议对任何非toy应用程序使用远程后端,但这意味着状态数据不能直接在本地磁盘上使用。但是,可以使用
terraform state pull
命令从远程后端检索它的快照,该命令将JSON格式的状态数据打印到stdout,以便调用程序捕获和解析它。

是的,我以前也有同样的想法。目前,当我应用新的地形变化时,我使用几种方法来降低风险

他们不能保证terraform应用100%成功,但会在应用之前解决大多数问题

  • 验证地形配置文件
  • Terraform具有启动的功能。但它不够聪明,无法遍历子文件夹。我创建了一个小shell函数,并添加了CI/CD管道,以便在应用terraform之前自动运行它

    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已经对此进行了解释,并提供了有关此命令的详细信息

  • 运行自动化测试厨房
  • 这是一个用于测试地形配置的测试厨房插件

    这是一个集成测试。测试将在单独的VPC中运行,添加的测试用例最多。在CI/CD管道中添加自动化测试,以便在每次向主分支发出合并请求时触发自动化测试。只有在测试通过后才能应用更改。

    我们最近公开了我们的瑞士军刀,用于测试基础架构代码

    今天,您可能正在通过部署、验证和取消部署来手动测试所有基础架构代码。Terratest可帮助您自动化此过程:

  • 用Go编写测试
  • 使用Terratest中的助手执行真实的IaC工具(如Terraform、Packer等),以便在真实环境(如AWS)中部署真实的基础设施(如服务器)。请注意,此环境将是一个单独的“沙盒”帐户,而不是prod
  • 在Terratest中使用帮助程序,通过发出HTTP请求、API调用、SSH连接等,验证基础设施在该环境中是否正常工作
  • 使用Terratest中的助手在测试结束时取消部署所有内容
  • 下面是一些地形代码的示例测试:

    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分钟。它不快(虽然使用和可以加快一些速度),而且您必须努力使测试可靠,但这是值得的