合并 2 个以上的 tfvars 文件内容

Merge more than 2 tfvars file contents

我有一个用例,其中有 3 个 tfvars 文件

1.tfvars
api_stages=[
  {
      api_id= "xxxx"
      stage="play"
  }
]

2.tfvars
api_stages=[
  {
      api_id= "yyy"
      stage="play"
  }
]

3.tfvars    
api_stages=[
  {
      api_id= "zzz"
      stage="play"
  }
]

我正在使用这个创建 1 个单一使用计划

resource "aws_api_gateway_usage_plan" "usage_plan" {
  name         = var.usage_plan_name     
   throttle_settings {
    burst_limit = var.burst_limit
    rate_limit  = var.rate_limit
  }  
   
  dynamic "api_stages" {
      for_each = var.api_stages
      content {
        api_id     = api_stages.value.api_id
        stage = api_stages.value.stage      
      }
    }
}

并且这个 tfvars 文件将由不同的用户创建。

问题:如何合并这个不同的 tfvars 文件并将所有 api_id 和阶段附加到单一使用计划?

现在我在做计划时,它只取最后一个文件的值。

.tfvars 文件处理发生在任何配置表达式被求值之前,所以没有办法 完全 你在这里问的问题:[=13 的规则=] 文件始终是特定变量“获胜”的最后定义,如您所见。

一些接近您想要的选项是:

  • 定义三个不同的变量,命名可能是为了表明提供这些值的三个不同来源,然后将它们三个连接在一起形成 local value:

    locals {
      all_api_stages = concat(
        var.a_api_stages,
        var.b_api_stages,
        var.c_api_stages,
      )
    }
    

    只有当恰好有三组变量对您的系统来说是一个有意义的约束时,这种方法才是合适的。

  • 在您的配置中声明实际的阶段对象,并使变量成为它们的键列表:

    variable "api_stages" {
      type = set(string)
    }
    
    locals {
      api_stages = {
        x = {
          api_id = "xxxx"
          stage  = "play"
        }
        y = {
          api_id = "yyyy"
          stage  = "play"
        }
        z = {
          api_id = "zzzz"
          stage  = "play"
        }
      }
    }
    

    您可以在 运行 Terraform 时使用 -var 选择适当的设置,而不是使用 -var-file:

    terraform apply -var='api_stages=["x", "y"]'