在地形中,如何仅在条件匹配的情况下分配资源块中的变量



我试图仅在条件匹配的情况下设置块中的变量。

resource "teleport_role" "test_role" {
spec = {
allow = {
kubernetes_labels = {
"label_1" = "${local.some_var == "something" ? ["value_1"] : null}"
}
}
}
}

当出现false条件时,在terrform plan中我得到:

+ "label_1" = null

最终在terraform apply:期间抛出错误

│ When applying changes to teleport_role. test_role, provider
│ "provider["terraform.releases.teleport.dev/gravitational/teleport"]"
│ produced an unexpected new value:
│ .spec.allow.kubernetes_labels["label_1"]: was null, but now
│ cty.ListVal([]cty.Value{cty.StringVal("")}).

简而言之,null不会让label_1被忽略。

如果条件是false,我如何确保变量根本不会被分配

例如,如果我必须用Python来做,它会是这样的:

if some_var == "something":
label_1 = value_1

参考编号:https://github.com/gravitational/teleport-plugins/issues/657

这是错误的,因为Kubernetes不允许在其API的规范模式中使用这种规范。go-cty似乎真的很努力地试图将HCL2/TF类型强制转换为与Kubernetes规范模式兼容的类型,这对他们来说很好。

在大多数语言(包括这一种(中,enumerables/iterables的值可能未指定,那么未指定的值需要为空,而不是nil/null等。

kubernetes_labels = local.some_var == "something" ? { "label_1" = ["value_1"] } : {}

go无法序列化Kubernetes清单的可能性很小(在这种情况下,条件需要处于更高的密钥(,但这是如何在Terraform中具体和一般地实现这一点的代码。

相关内容

最新更新