Terraform 如何输出使用for_创建的资源的多个实例的属性?
比如说,我有一张环境地图要为每个人提供Terraform 如何输出使用for_创建的资源的多个实例的属性?,terraform,terraform-provider-azure,terraform0.12+,Terraform,Terraform Provider Azure,Terraform0.12+,比如说,我有一张环境地图要为每个人提供 environments = { "0" = "dev" "1" = "test" "2" = "stage" } 然后,无论出于什么原因,我都希望为每个环境创建一个Azure资源组 resource "azurerm_resource_group" "resource_group" { for_each = var.environments name = "${var.resource-group-name}-$
environments = {
"0" = "dev"
"1" = "test"
"2" = "stage"
}
然后,无论出于什么原因,我都希望为每个环境创建一个Azure资源组
resource "azurerm_resource_group" "resource_group" {
for_each = var.environments
name = "${var.resource-group-name}-${each.value}-rg"
location = var.location
}
如何获得输出?我试过新的splat,但没有用
output "name" {
value = "${azurerm_resource_group.resource_group[*].name}"
}
output "id" {
value = "${azurerm_resource_group.resource_group[*].id}"
}
output "location" {
value = "${azurerm_resource_group.resource_group[*].location}"
}
错误:不支持的属性
in output "id":
6: value = "${azurerm_resource_group.resource_group[*].id}"
This object does not have an attribute named "id".
如何输出使用for\u创建的资源的多个实例的属性?编辑:for\u每个实例都不能用于输出
output "name"{
value = { for k, v in var.environments : v => azurerm_resource_group.resource_group[k].name }
}
output "id"{
value = { for k, v in var.environments : v => azurerm_resource_group.resource_group[k].id }
}
output "location"{
value = { for k, v in var.environments : v => azurerm_resource_group.resource_group[k].location }
}
示例输出
id = {
"dev" = "xxx"
"stage" = "yyy"
"test" = "zzz"
}
[*]
是从对象列表中提取属性的缩写for_each
使资源显示为对象的映射,因此[*]
运算符不合适
但是,有一种更通用的机制,可以通过为源集合的每个元素计算任意表达式,将列表或映射转换为另一个列表或映射
因此,我们可以将azurerm\u resource\u group
对象的映射简化为这些对象的名称映射,如下所示:
output "name" {
value = { for k, group in azurerm_resource_group.resource_group: k => group.name }
}
{
"0" = "something-dev-rg"
"1" = "something-test-rg"
"2" = "something-stage-rg"
}
您的输入映射使用数字索引作为键,这是不常见但允许的。因此,输出的结果值如下所示:
output "name" {
value = { for k, group in azurerm_resource_group.resource_group: k => group.name }
}
{
"0" = "something-dev-rg"
"1" = "something-test-rg"
"2" = "something-stage-rg"
}
在for_each
中,映射通常包含一个有意义的名称作为键,因此结果实例由该有意义的名称标识,而不是通过递增整数标识。如果将配置更改为使用环境名称作为密钥,则名称映射将如下所示:
{
"dev" = "something-dev-rg"
"test" = "something-test-rg"
"stage" = "something-stage-rg"
}
在输出“name”:2:for_each=var.environments中,此处不需要名为“for_each”的参数代码>如果您没有实际使用这些键,为什么这是一个映射而不仅仅是一个列表/集合?给定提供的配置,环境
可以是一个列表而不是映射类型,并且位置输出可以是value=var.location
。除此之外,azurerm\u resource\u group.resource\u group
对象将不支持splat操作符,因为您已经发现了自己。这是<0.12版本的输出解决方案,但不幸的是,它没有转换为新的迭代器。我不确定你正在尝试做的事情目前是否可行。我必须使用地图,因为这是每个人所需要的。我基本上只是尝试获取每个元素的输出,就像您使用count和splat一样。