Terraform中如何从结构不一致的多层嵌套HCL对象中统一提取id属性值
Terraform中如何从结构不一致的多层嵌套HCL对象中统一提取id属性值
这种结构不统一的状态输出确实挺闹心的,尤其是你还不想把OCI的全量数据都塞进状态文件里,完全理解你想高效提取所有id的需求。我来给你一个具体的实现思路,用Terraform的内置函数组合就能搞定:
首先,先把你拿到的原始输出整理成可参考的代码块(方便后续对应):
variable "instances" { type = any default = [ { "details" = { "controllers" = { "pri" = { "hostname" = "XXXXXXXXXdc001" "id" = "some_long_ocid_1" "ip" = "xxx.xxx.xxx.xxx" } "sec" = { "hostname" = "XXXXXXXXXdc002" "id" = "some_long_ocid_2" "ip" = "xxx.xxx.xxx.xxx" } } "domain" = "xxxxxxxxxxxxx.org" "smbdomain" = "XXXXX" } }, { "xxxxxxxxxxxx000" = { "id" = "some_long_ocid_3" "ip" = "xxx.xxx.xxx.xxx" } }, { "xxxxxxxxxxxx001" = { "id" = "some_long_ocid_4" "ip" = "xxx.xxx.xxx.xxx" } } ] }
接下来,你可以通过local变量结合for表达式、flatten、contains这些函数,针对两种不同的结构分别处理,最终统一提取所有id:
locals { instance_ids = flatten([ for item in var.instances : [ # 处理域控那种带details多层嵌套的结构 if contains(keys(item), "details") => [ item.details.controllers.pri.id, item.details.controllers.sec.id ], # 处理单键值对的普通实例结构 true => [ for val in values(item) : val.id ] ] ]) }
代码解释:
- 外层用
for item in var.instances遍历每一个实例对象; - 对每个对象先判断:如果包含
details键,就直接从多层嵌套里取出主备域控的id; - 如果是普通实例结构(顶层只有一个实例名称键),就用
values(item)拿到键对应的对象值,再提取其中的id; - 最后用
flatten把所有分散的id数组“拉平”成一个一维数组,正好得到你想要的格式:"instances" = [ "some_long_ocid_1", "some_long_ocid_2", "some_long_ocid_3", "some_long_ocid_4" ]
如果后续还有其他结构的实例输出,你只需要扩展这个条件判断逻辑就行——比如用try函数来容错,避免因为结构异常报错,或者添加更多的if分支处理特殊情况。
内容来源于stack exchange
相关产品推荐
相关产品推荐

