Terraform按managed-identity-name获取namespace报错排查与解决
Terraform 根据 managed-identity-name 获取 namespace 的问题解决
问题2:为何已用contains检查key,逻辑仍在访问数据前失败?
Terraform 的 for 表达式遵循先求值返回值表达式,再判断条件的顺序。你原代码中file.value["managed-identity-name"]属于条件判断的一部分,但 Terraform 会先尝试对数组中所有元素求值该表达式,当遇到没有managed-identity-name这个key的元素(比如第二个对象)时,直接抛出索引错误,此时contains(keys(file.value), "managed-identity-name")的检查还未执行,因此报错。
问题1:如何根据 managed-identity 获取对应的 namespace 值?
以下几种方法可以安全实现匹配,同时避免索引错误:
方法1:使用lookup函数(推荐)
lookup函数支持安全访问对象属性,当目标key不存在时返回指定默认值,不会触发错误:
locals { managed-identity-name = "xac-internal-us-practiceeditors-identity" yamlfs = [ { "value" = { "annotations" = {} "labels" = { "name" = "practiceeditors" "owner" = "xd-cloud-devops_at_abc.com" } "managed-identity-name" = "xac-internal-us-practiceeditors-identity" "namespace" = "practiceeditors" } }, { "value" = { "annotations" = {} "labels" = { "name" = "practice1editors" "owner" = "xd-cloud-devops_at_abc.com" } "namespace" = "practice1editors" } }, ] matching_files = [ for file in local.yamlfs : file.value.namespace if lookup(file.value, "managed-identity-name", "") == local.managed-identity-name ] }
方法2:使用try函数捕获错误
try函数会尝试执行目标表达式,执行失败时返回指定默认值:
locals { # ... 其他代码不变 ... matching_files = [ for file in local.yamlfs : file.value.namespace if try(file.value["managed-identity-name"], "") == local.managed-identity-name ] }
方法3:先过滤含目标key的元素
通过嵌套for表达式,先筛选出包含managed-identity-name的元素,再进行匹配判断:
locals { # ... 其他代码不变 ... matching_files = [ for file in [for f in local.yamlfs : f if contains(keys(f.value), "managed-identity-name")] : file.value.namespace if file.value["managed-identity-name"] == local.managed-identity-name ] }
执行后local.matching_files会得到匹配的namespace数组(示例中为["practiceeditors"])。如果需要单个值而非数组,可使用one(local.matching_files)获取唯一匹配项(需确保仅存在一个匹配结果,否则会报错)。
内容的提问来源于stack exchange,提问作者akhil
相关产品推荐
相关产品推荐

