如何用yq结合properties文件修改YAML中的列表嵌套映射
解决YAML数组元素更新时丢失短横线的问题
问题场景
需要更新YAML中createVnicDetails列表内subnetIdRef.name,以及sourceDetails列表内sourceId的值,但使用yq '. *= load_props("/compute.properties")'命令后,原YAML中的数组短横线(-)丢失,数组被转为普通对象。
原YAML内容:
apiVersion: core.oci.upbound.io/v1alpha1 kind: Instance metadata: name: crossplane-inst-flat spec: forProvider: compartmentIdRef: name: compartment-oke-shu createVnicDetails: - subnetIdRef: name: crossplane-srg-subnet availabilityDomain: "yyy:PHX-AD-1" shape: "VM.Standard2.1" sourceDetails: - sourceId: ocid1.image.oc1.phx.7ytytytytytyt sourceType: "image" displayName: crossplane-inst-flat
使用的compute.properties内容:
spec.forProvider.createVnicDetails.subnetIdRef.name=test spec.forProvider.sourceDetails.sourceId=ocid1.image.oc1.phx.hhhh spec.forProvider.sourceDetails.sourceType=image
原因
load_props加载的properties文件路径是针对对象结构的,而原YAML中createVnicDetails和sourceDetails是数组结构。直接用*=合并时,yq会将数组节点替换为对象,导致数组标识(短横线)丢失。
解决方法
方法1:修改properties文件,指定数组索引
将properties文件中的路径改为包含数组索引的形式,明确指向数组的第一个元素:
spec.forProvider.createVnicDetails[0].subnetIdRef.name=test spec.forProvider.sourceDetails[0].sourceId=ocid1.image.oc1.phx.hhhh spec.forProvider.sourceDetails[0].sourceType=image
然后执行yq命令进行合并:
yq '. |= load_props("/compute.properties")' config.yaml
该命令会正确定位到数组内的元素进行更新,保留原数组结构。
方法2:不修改properties文件,用yq逐个指定更新路径
如果不想修改properties文件,可以先加载properties内容到变量,再逐个更新数组元素:
yq ' $props = load_props("/compute.properties"); .spec.forProvider.createVnicDetails[0].subnetIdRef.name = $props.spec.forProvider.createVnicDetails.subnetIdRef.name; .spec.forProvider.sourceDetails[0].sourceId = $props.spec.forProvider.sourceDetails.sourceId; .spec.forProvider.sourceDetails[0].sourceType = $props.spec.forProvider.sourceDetails.sourceType ' config.yaml
这种方式通过显式指定数组索引,避免破坏原数组结构,同时完成目标字段的更新。
内容的提问来源于stack exchange,提问作者Shubham Jain
相关产品推荐
相关产品推荐

