将多个 for_each 的值合并为单个列表

huangapple go评论120阅读模式
英文:

Join multiple for_each value into a single list

问题

for_each = {for key, val in concat([for env in azuredevops_environment.impl_regional_environment : env], [for env in azuredevops_environment.test_regional_environment : env], [for env in azuredevops_environment.prev_regional_environment : env], [for env in azuredevops_environment.pcpy_regional_environment : env]) : key => val if length(regexall("US - ", val.name)) > 0}
英文:

I am trying to combine multiple for_each values into a list from different resources. To then use in another resource within a for_each

Terraform Version: v1.4.2
provider registry.terraform.io/microsoft/azuredevops v0.4.0

Code:

#Implementation environments
resource "azuredevops_environment" "impl_regional_environment" {
  for_each    = toset(var.environment_regions)
  project_id  = data.azuredevops_project.vrx.id
  name        = "${each.key} - IMPL"
  description = "${each.key} Implementation Environment. \n**Managed by Terraform**"  
}

#Test environments
resource "azuredevops_environment" "test_regional_environment" {
  for_each    = toset(var.environment_regions)
  project_id  = data.azuredevops_project.vrx.id
  name        = "${each.key} - TEST"
  description = "${each.key} Test Environment. \n**Managed by Terraform**"
}

#Preview environments
resource "azuredevops_environment" "prev_regional_environment" {
  for_each    = toset(var.environment_regions)
  project_id  = data.azuredevops_project.vrx.id
  name        = "${each.key} - PREV"
  description = "${each.key} Preview Environment. \n**Managed by Terraform**"
}

I am trying to combine, as I want to say if the name contains "US" then apply the resource to that value ID.

resource "azuredevops_check_business_hours" "us_non-production" {
  project_id           = data.azuredevops_project.vrx.id
  display_name         = "Daily Deployment Window \n**Managed by Terraform**"
  for_each =  {for key, val in concat(azuredevops_environment.impl_regional_environment,azuredevops_environment.test_regional_environment,azuredevops_environment.prev_regional_environment,azuredevops_environment.pcpy_regional_environment):
               key => val if length(regexall("US - ", val.name)) > 0}
  target_resource_id   = each.value.id
  target_resource_type = "environment"
  start_time           = "18:00"
  end_time             = "23:30"
  time_zone            = "Central Standard Time"
  monday               = true
  tuesday              = true
  wednesday            = true
  thursday             = true
  friday               = true
  saturday             = true
  sunday               = true
}

If I use concat I get the error of:

│ Error: Invalid function argument
│
│   on modules\project_vrx\vrx_environments\main.tf line 144, in resource "azuredevops_check_business_hours" "us_non-production":
│  144:   for_each =  {for key, val in concat(azuredevops_environment.impl_regional_environment,azuredevops_environment.test_regional_environment,azuredevops_environment.prev_regional_environment,azuredevops_environment.pcpy_regional_environment):
│     ├────────────────
│     │ while calling concat(seqs...)
│     │ azuredevops_environment.impl_regional_environment is object with 6 attributes
│
│ Invalid value for "seqs" parameter: all arguments must be lists or tuples; got object.

答案1

得分: 2

为了能够连接你的地图,你必须从中获取列表。你可以使用 values 来实现这一点:

  for_each =  {
    for key, val in concat(values(azuredevops_environment.impl_regional_environment), values(azuredevops_environment.test_regional_environment),  values(azuredevops_environment.prev_regional_environment),  values(azuredevops_environment.pcpy_regional_environment)): key => val if length(regexall("US - ", val.name)) > 0
  }
英文:

To be able to cocatanate your maps, you have to get lists from them. You can do this using values:

  for_each =  {
    for key, val in concat(values(azuredevops_environment.impl_regional_environment), values(azuredevops_environment.test_regional_environment),  values(azuredevops_environment.prev_regional_environment),  values(azuredevops_environment.pcpy_regional_environment)): key => val if length(regexall("US - ", val.name)) > 0
  }

huangapple
  • 本文由 发表于 2023年4月19日 17:13:08
  • 转载请务必保留本文链接:https://go.coder-hub.com/76052729.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定