假设我有一张环境地图可以提供给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
}
如何获取输出?我没有尝试过新的摔跤。
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创建的资源的多个实例的属性?
答案 0 :(得分:3)
[*]
是从对象列表中提取属性的简写。 for_each
使资源显示为对象的 map ,因此[*]
运算符不合适。
但是,for
expressions是一种更通用的机制,可以通过对源集合的每个元素求值任意表达式,将列表或映射转换为另一个列表或映射。
因此,我们可以将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"
}
答案 1 :(得分:0)
编辑:for_each不适用于输出
PAIR/PAIR
示例输出
PUB/SUB