英文:
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
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论