我的地形代码看起来像这样:
locals {
overrides = {
foo = {
connections = {
connection-one = {
bool_setting = "true"
}
connection-two = {
string_value = "primary"
}
}
}
}
my_json = {
"description" = "blah"
"psk" = {
for_each = try(local.overrides.foo.connections, {}) # <-- problem
each.key : random_string.password[each.key]
}
}
}
resource "random_string" "password" {
for_each = try(local.overrides.foo.connections, {})
length = 20
special = true
}
output "json_output" {
value = jsonencode(local.my_json)
}
我知道我的代码是错误的,因为for_each
在我指出问题的地方不允许使用块,但我希望这个片段能够演示我想要实现的目标。
注意:local.overrides
可能并不总是具有该connections
属性,因此try()
.
我想要如下所示的输出:
{
"description": "blah",
"psk": {
"connection-one": "g2rL6IEF1XXp_JL]N<H!",
"connection-two": "EVBQvSj@5a9lo:OZ<S_T"
}
}
我如何在 Terraform 中实现这一目标?
、和块
for_each
中的参数是这些特定语言功能的固有部分,而不是可以在配置的其他部分中单独使用的独立单元。resource
data
dynamic "..."
但是,如果您需要从需要表达式的位置的现有集合生成新的序列或映射值,则可以使用专为该特定目的而设计的
for
表达式。要生成从实例到生成的密码(没有每个对象的其他部分)的映射
random_string.password
,您可以编写如下表达式:该表达式依赖于这样一个事实:
random_string.password
具体化为从实例键到表示该资源的每个实例的对象的映射。的文档random_string
表示该类型的实例具有result
包含生成的字符串的属性,因此在此表达式中将结果的每个元素的值设置为相应资源实例的属性obj.result
值。result
以下是将其集成到您的
local.my_json
定义中的方法:顺便:
如果您生成的这些字符串确实是密码,那么使用它可能更合适
random_password
,它具有一组类似的功能和参数。除了更好地描述资源的意图之外,提供程序还将该资源类型的结果声明为“敏感”,因此 Terraform 默认情况下不会在 UI 中显示生成的密码,但仍会将其保存在状态,以便您可以
terraform output -raw json_output
在需要时使用命令检索它们。