terraform - 如何输出使用 for_each 创建的资源的多个实例的属性?
问题描述
假设我有一张环境地图要提供给 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"
}
map in 包含一个有意义的名称作为键更为常见for_each
,因此结果实例由该有意义的名称标识,而不是通过递增整数来标识。如果您将配置更改为使用环境名称作为键,则名称映射将如下所示:
{
"dev" = "something-dev-rg"
"test" = "something-test-rg"
"stage" = "something-stage-rg"
}
推荐阅读
- typescript - moment.js 对象的 JSDoc typedef 声明
- c++ - 使用递归的数组总和错误(编译和运行时)
- c# - 使用 iText 7,导出 Flate 编码图像的正确方法是什么?
- r - dplyr 的问题(将 which.min 应用于数据帧列表)
- sql - 文本上的 CASE 逻辑在转换数据类型错误时提供数字结果
- angular - 相同的打字稿,但在 Angular 8 中使用不同的 HTML 视图格式
- javascript - 无头浏览器图像质量 - Headless chrome、phantom js、slimmer js
- c++ - 待定:对同一工作采取不同的措施?
- ios - 无法设置 UIView 的背景颜色 Swift 5
- javascript - 使元素看起来好像它们共享背景