假设我有一个环境地图要提供给 for_each
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_each创建的资源的多个实例的属性?
的 [*]
是从对象列表中提取属性的简写。for_each
使资源显示为一个 地图 的对象,所以 [*]
操作员是不合适的。
然而, for
表情 是一种更通用的机制,它可以通过对源集合的每个元素评估一个任意的表达式,将一个列表或地图变成另一个列表或地图。
因此,我们可以将一个映射简化为 azurerm_resource_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"
}
更常见的情况是,一个地图在 for_each
来包含一个有意义的名称作为键,这样产生的实例就可以通过这个有意义的名称来识别,而不是通过递增整数来识别。如果你改变了配置,使用环境名作为键,那么名字的映射就会像这样。
{
"dev" = "something-dev-rg"
"test" = "something-test-rg"
"stage" = "something-stage-rg"
}
EDIT: for_each不能用于输出
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"
}