我试图仅在条件匹配的情况下设置块中的变量。
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中具体和一般地实现这一点的代码。