如何通过Go代码或Kustomize在运行时向YAML添加指定条目?
问题场景
我有如下YAML配置文件,其中spec->mec->customConfig->sif路径下已存在snk_dev条目:
spec: mec: tolerations: - effect: NoSchedule key: WorkGroup operator: Equal value: goxy resources: requests: cpu: 100m memory: 1Gi customConfig: sif: prom_exporter: type: prometheus_exporter snk_dev: type: sk_hc_logs inputs: - tesslt ep: ${NT} dken: ${SN} encoding: codec: "json" index: us compression: gzip buffer: type: memory
需要在spec->mec->customConfig->sif路径下添加新条目snk_prod:
snk_prod: type: sk_hc_logs inputs: - tesslt ep: ${NT} dken: ${SN} encoding: codec: "json" index: us compression: gzip buffer: type: memory
目前正在使用Kustomize,想了解是否可以通过预定义待添加文件在运行时完成添加,或是使用go-yaml库实现该需求?
方案一:用Kustomize实现
Kustomize可以通过补丁文件结合kustomization.yaml完成字段添加,步骤如下:
- 创建补丁文件
add-snk-prod.yaml,内容为:
spec: mec: customConfig: sif: snk_prod: type: sk_hc_logs inputs: - tesslt ep: ${NT} dken: ${SN} encoding: codec: "json" index: us compression: gzip buffer: type: memory
- 在
kustomization.yaml中引用该补丁:
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - your-original-file.yaml # 替换为你的原始YAML文件名 patchesStrategicMerge: - add-snk-prod.yaml
- 执行
kustomize build命令,即可生成包含snk_prod的最终配置。
如果需要动态控制添加逻辑,可以先通过脚本生成上述补丁文件,再执行Kustomize构建。
方案二:用go-yaml库实现
通过Go代码直接解析、修改YAML文件,示例代码如下:
package main import ( "os" "gopkg.in/yaml.v3" ) func main() { // 读取原始YAML文件 data, err := os.ReadFile("your-original-file.yaml") if err != nil { panic(err) } // 解析为map结构 var config map[string]interface{} err = yaml.Unmarshal(data, &config) if err != nil { panic(err) } // 构建snk_prod配置 snkProd := map[string]interface{}{ "type": "sk_hc_logs", "inputs": []string{ "tesslt", }, "ep": "${NT}", "dken": "${SN}", "encoding": map[string]interface{}{ "codec": "json", }, "index": "us", "compression": "gzip", "buffer": map[string]interface{}{ "type": "memory", }, } // 导航到目标路径并添加snk_prod spec := config["spec"].(map[string]interface{}) mec := spec["mec"].(map[string]interface{}) customConfig := mec["customConfig"].(map[string]interface{}) sif := customConfig["sif"].(map[string]interface{}) sif["snk_prod"] = snkProd // 将修改后的配置写入文件 output, err := yaml.Marshal(config) if err != nil { panic(err) } err = os.WriteFile("modified-file.yaml", output, 0644) if err != nil { panic(err) } }
运行这段代码即可直接修改原始YAML文件,添加snk_prod条目。如果YAML结构固定,建议定义对应结构体替代map[string]interface{},避免类型断言错误。
内容的提问来源于stack exchange,提问作者Jenney
相关产品推荐
相关产品推荐

