terraform - Terraform - 反转地图
问题描述
我一直在尝试编写一个可以改变这个的 terraform 表达式:
subnets = {
my_subnet_1 = {
nsg = "my_nsg_1",
addresses = "my_addresses_1"
}
my_subnet_2 = {
nsg = "my_nsg_2",
addresses = "my_addresses_2"
}
}
进入
nsgs_assocs = {
my_nsg_1 = "my_subnet_1"
my_nsg_2 = "my_subnet_2"
}
我尝试了以下方法:
locals {
nsgs_assocs = zipmap(
var.subnets.*.nsg,
keys(var.subnets)
)
}
但这给出了一个错误:
Error: Invalid function argument
on ..\..\modules\vnet\main.tf line 22, in locals:
21: nsgs_assocs = zipmap(
22: var.subnets.*.nsg,
23: keys(var.subnets)
24: )
Invalid value for "keys" parameter: element 0: string required.
对于上下文,我继承了一堆脚本,我试图在不改变terraform plan
.
其中一个模块有很多相关的查找图——例如:
nsgs_assocs = {
my_nsg_1 = "my_subnet_1"
my_nsg_2 = "my_subnet_2"
}
subnet_addresses = {
my_subnet_1 = "my_addresses_1"
my_subnet_2 = "my_addresses_2"
}
我已经将其浓缩为我的第一个上面的示例,我认为从长远来看它会更易于维护。
但是,为了向后兼容现有的 terraform 状态,我需要nsgs_assocs
在我的模块中生成原始状态,以便 afor_each
继续使用 nsg 名称作为资源键而不是子网名称(由于键更改,这会导致销毁/创建对)。
解决方案
你在正确的轨道上。它不起作用,因为splat 表达式适用于数组,并且var.subnets
是一个映射。为了修复它,您需要将其转换为数组,并且可以使用values terraform 函数来完成:
locals {
nsgs_assocs = zipmap(
values(var.subnets)[*].nsg,
keys(var.subnets)
)
}
推荐阅读
- sql - MS Access 查询太慢
- string - 如何在 Go 中有效地将字符串转换为字节切片,包括最后的 0?
- python - 如何在我的python代码中使用while循环
- php - PHP条件语句?
- react-native - 组件卸载后,TextInput 光标指针仍保留在屏幕上
- unit-testing - Bazel 的测试:CppCompileAction.java 是否有任何测试?
- reactjs - preact 有类似于 react proptypes 的东西吗?
- wordpress - 在查询中使用偏移参数时,Wordpress 分页修复或破解?
- .net - .NET to Delphi (string.Substring function)
- javascript - jquery.qrcode.js 渲染到带有徽标的 img