如何通过代码向 yaml 文件添加新条目

2024-02-13

我有 yaml 文件,我需要使用 go 代码在运行时向其中添加数据 路径就像下面这样,我的意思是

这是 yaml 文件,其下有一个条目sif of 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
  

在以下 yaml 路径下我需要添加一个新条目

spec->mec->customConfig->sif一个新条目snd_prd

    snk_prod:   
      type: sk_hc_logs
      inputs:
        - tesslt
      ep: ${NT}
      dken: ${SN}
      encoding:
        codec: "json"
      index: us
      compression: gzip
      buffer:
        type: memory

我们正在使用 kustomize,我想知道是否有办法通过代码来完成它,我的意思是提前选择我需要添加的文件并在运行时添加它 或者也许更好地使用https://github.com/go-yaml/yaml


Yaml 编解码器支持解码为map[string]any并将此类映射编码为 yaml。

这个想法是解码文档和额外的树,然后将额外的映射放在所需的路径下,然后编码回来。

type YamlObject map[string]any

func main() {
    // Parse the initial document
    doc := make(YamlObject)
    yaml.Unmarshal([]byte(document), &doc)
    // Parse the additional nodes
    addon := make(YamlObject)
    yaml.Unmarshal([]byte(extra), &addon)
    // Find the node by the path
    node := findChild(doc, "spec", "mec", "customConfig", "sif")
    if node == nil {
        panic("Must not happen")
    }
    // Add the keys from the additional document
    // under the specified path
    for key, val := range addon {
        (*node)[key] = val
    }
    // Output the modified document
    outDoc, _ := yaml.Marshal(doc)
    println(string(outDoc))
}

func findChild(obj YamlObject, path ...string) *YamlObject {
    if len(path) == 0 {
        return &obj
    }
    key := path[0]
    child, ok := obj[key]
    if !ok {
        return nil
    }
    obj, ok = child.(YamlObject)
    if !ok {
        return nil
    }
    return findChild(obj, path[1:]...)
}

完整示例https://go.dev/play/p/pTdXR53p0mq https://go.dev/play/p/pTdXR53p0mq

Output:

spec:
    mec:
        customConfig:
            sif:
                prom_exporter:
                    type: prometheus_exporter
                snk_dev:
                    buffer:
                        type: memory
                    compression: gzip
                    dken: ${SN}
                    encoding:
                        codec: json
                    ep: ${NT}
                    index: us
                    inputs:
                        - tesslt
                    type: sk_hc_logs
                snk_prod:
                    buffer:
                        type: memory
                    compression: gzip
                    dken: ${SN}
                    encoding:
                        codec: json
                    ep: ${NT}
                    index: us
                    inputs:
                        - tesslt
                    type: sk_hc_logs
        resources:
            requests:
                cpu: 100m
                memory: 1Gi
        tolerations:
            - effect: NoSchedule
              key: WorkGroup
              operator: Equal
              value: goxy

YAML 代码按字母顺序输出键

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过代码向 yaml 文件添加新条目 的相关文章

  • MATLAB 是否已有 YAML 库/解析器?

    我想使用 YAML 跨多种语言交流一些数据 将其视为 与语言无关的序列化 其中一种语言是 MATLAB 但我似乎找不到该语言的 YAML 库 我在 Google 上检查了 matlab yaml 和 matlab yaml parse 似乎
  • Go中funcappend的实现在哪里?

    我对 go 非常感兴趣 并尝试阅读 go 函数的实现 我发现其中一些函数没有实现 如追加或调用 The append built in function appends elements to the end of a slice If i
  • 为什么我不能执行 fmt.Sprintf("%d.%d.%d.%d", a...)?

    我正在学习 Go 但我一直坚持 Go 之旅 exercise stringer go https tour golang org methods 7 https tour golang org methods 7 这是一些代码 type I
  • 带 cookie 身份验证的 Gorilla websocket

    这是我的设置 我正在构建一个带有用户登录的服务 使用 Negroni 和 Gorilla 登录后 用户会获得一个会话 cookie 服务器使用该会话 cookie 来授权受保护的端点 受保护的端点之一允许用户 客户端与服务器打开 Webso
  • 在 Go 中使用 init() 函数真的很糟糕吗?

    几天前我开始了一个新的 go 项目 我使用 golangci lint 使我的代码具有良好的风格 我发现 gochecknoinits 是 golangci lint 的 linter 之一 它告诉我不要使用 init 在我看来 为了方便起
  • 将绝对路径和相对路径组合起来得到新的绝对路径

    我正在编写一个程序 其中一个组件必须能够采用给定的路径 例如 help index html or help 和基于该位置的相对路径 例如 otherpage index html or sub dir of help or help2 h
  • 如何使用json传递opentracing数据

    我的 API 网关启动一个跟踪器和一个用于验证电子邮件的范围 然后它传递给user service用于验证 我想通过这个span详情至user service作为 json 对象并启动另一个span as a tracer start sp
  • ReverseProxy取决于golang中的request.Body

    我想构建一个 http 反向代理 它检查 HTTP 主体 然后将 HTTP 请求发送到它的上游服务器 你怎么能在 Go 中做到这一点 初始尝试 如下 失败 因为 ReverseProxy 复制传入请求 修改它并发送 但正文已被读取 func
  • 如何在 Visual Studio Code 中使用 Delve 调试器进行远程调试

    我已经问过了 得到了很好的答复answer https stackoverflow com questions 39058823 how to use delve debugger in visual studio code用于使用 del
  • 我想在后端验证来自 golang 前端的时区

    前端在注册期间发送时区以及其他用户详细信息 我需要在时区上放置一个验证器来进行 api 测试 时区数据的格式为 GMT 10 00 Hawaii GMT 08 00 Pacific Time US amp Canada 我所做的是定义数组中
  • 检查值是否实现接口的说明

    我读过 Effective Go 和其他类似这样的问答 golang接口合规性编译类型检查 https stackoverflow com questions 17994519 golang interface compliance com
  • 构建链代码时 ltdl.h 未找到错误

    我正在尝试使用构建链码go build 当我运行 Go build 命令时它的报告 hyperledger fabric vendor github com miekg pkcs11 pkcs11 g o 29 18 fatal error
  • 当涉及多个渠道时,select 如何工作?

    我发现在多个非缓冲通道上使用 select 时 例如 select case lt chana case lt chanb 即使两个通道都有数据 但在处理此选择时 case chana 和 case chanb 的跟注不平衡 package
  • 在 Go 中跟踪 HTTP 请求时指定超时

    我知道通过执行以下操作来指定 HTTP 请求超时的常用方法 httpClient http Client Timeout time Duration 5 time Second 但是 我似乎不知道在跟踪 HTTP 请求时如何执行相同的操作
  • 如何分析 VSCode 中函数的性能

    我用 C Golang 编写了一个程序 如何找到占用最高 CPU 周期的函数 目的是提高正在执行的程序的性能 2021 年 10 月 金香儿哈娜 https github com hyangah宣布 tweet https twitter
  • for 循环初始值设定项中的结构

    知道为什么 for 循环初始值设定项中的这个结构表达式在编译时会出现语法错误吗 在这种情况下 指向结构的指针工作正常 但 ofc 我需要如下所示的局部变量 感谢您的建议 type Request struct id int line byt
  • 连接数组时合并两个 yaml 文档

    我想合并两个 yaml 文档 结果包含 所有映射值 最后一个优先 串联数组 例如给定这个文件 file1 yml animals elephant donkey flavours sour lemon sweet chocolate str
  • 我怎么知道我的所有 goroutine 确实正在使用 golang 的同步包等待一个条件

    我有一个应用程序 我正在创建多个 goroutine 来同时执行某个任务 所有工作协程都会等待条件 事件发生 一旦事件被触发 它们就会开始执行 创建完所有goroutines后 主线程在发送广播信号之前应该知道所有goroutines确实处
  • 转储 YAML 时如何强制使用双引号?

    我有一个小脚本来自动化 YAML 文件中的一些操作 我读取原始 YAML 文件并将其转换为哈希 然后dump http ruby doc org stdlib 1 8 6 libdoc yaml rdoc YAML html method
  • 使用 HTTPS GRC 从 AWS Codecommit 获取私有存储库

    我正在尝试导入位于 AWS codecommit 中的模块 为了克隆存储库 我使用 HTTPS GRC Git 远程代码提交 方法 该方法使用 Google Suite 凭证来访问 AWS 控制台 我用来克隆存储库的命令是 git clon

随机推荐

  • 原生 Android BLE 实现本质上是同步的吗?

    我记得读过 指导和提示 http img developer samsung com contents authCdn ble Guide and Hints for Samsung BLE API pdf gda 1375430976 5
  • 如何加速 VBA 代码

    我有一个带有VBA代码的excel文件 不是我写的 该代码的工作原理是用户在用户表单中输入 6 位数字 然后 VBA 检查另一张工作表 并检查该 6 位数字是否存在于工作表上 如果是 则会更改阶段 但如果没有 则会将此 6 位数字添加到工作
  • 在特定时间后在 Angular JS 中实时更新高图表

    我想在特定时间跨度后在 Angular JS 中实时更新高图表 并且它应该在 html 上得到反映 而无需在 Angular JS 中进行用户交互 下面是控制器 指令和 HTML 的代码 我正在使用 REST Web 服务从后端获取数据 控
  • 使用 waitKey 来暂停和播放视频

    我有一个VideoCapture在 OpenCV 中 我可以成功显示给定的视频 我现在想做的是通过按一个键来暂停和播放 可选哪个键 只要有效即可 我一直在读关于waitKey但有一些关于这整件事我不明白 ASCII 以及如何绑定键 我的理解
  • Nexus 和上传 .NET 应用程序的工件

    Nexus 是否可以用作 NET 应用程序构建输出的工件管理器 我非常了解 Nexus 可以成为出色的 nuget 代理和内部工件管理器 但是我需要 Nexus 在这些库的下游进行操作并存储 TeamCity 构建的输出 我研究过使用 RE
  • 使用泛型类中定义的泛型参数调用非泛型方法

    这是我的问题 public class MyClass
  • 使用亚马逊API获取产品详细信息

    我有以下代码来输出来自亚马逊的商品列表 但我不确定如何访问特定产品 带有 Summery 评论等 任何帮助 将不胜感激
  • 如何使用毕加索的颜色作为占位符图像?

    我想使用毕加索将颜色设置为占位符图像 我试过这个 int placeHolderColor2 Color rgb 20 20 20 Picasso with context load item getImageUrls get 0 plac
  • 如何在 iOS 的 flutter 中将图像流缓冲区转换为 jpeg 图像字节?

    当我们处理相机时flutter 我们用Camera plugin It has startImageStream返回的方法CameraImage cameraImage数据类型 In iOS cameraImage format is bg
  • 检查 DI-Graph 中是否存在任何路径

    如果我有一个有向图 如何检查所有节点对 a b 是否创建路径 Example Input v1 v2 v5 v6 v2 v3 v3 v4 v4 v5 v0 v1 我需要检查该图中是否存在至少一条路径 而无需多次访问每个节点 我已经尝试过回溯
  • 是否可以将参数传递到通过选项卡访问的 FB 应用程序的回调 URL?

    我有这个 Facebook 应用程序 它向粉丝页面添加自定义选项卡 您可以通过以下 URL 访问该选项卡 http www facebook com pages PAGE NAME HERE PAGE ID v APP ID http ww
  • 如何在Python中模拟CPU和内存压力

    我想知道是否有人用 python 编写了模拟 cpu 和内存压力的代码 我看到一段加载 cpu 的代码 但如何强制它们在 90 的使用率下工作 一个节点主要有 4 种经常使用的资源 有效内存 中央处理器周期 储存空间 网络负载 上传和下载
  • 更改 DataMember 的 XML 命名空间

    我有两个DataContract我正在使用 a 序列化为 XMLDataContractSerializer 我为两个不同的指定了不同的命名空间DataContract然而 有一个DataMember每一个DataContract属于相同的
  • HTMLCollection、NodeList 和对象数组之间的区别

    当谈到 DOM 时 我总是对 HTMLCollections 对象和数组感到困惑 例如 有什么区别document getElementsByTagName td and td myTable and td 是对象 jQuery 对象 为什
  • 如何生成一个不以 0 开头且具有唯一数字的随机 4 位数字?

    这几乎可以正常工作 但数字有时以 0 开头 import random numbers random sample range 10 4 print join map str numbers 我找到了很多例子 但没有一个能保证序列不会以0
  • 解析 HTML:成人分类系统

    我正在研究网络上使用的不同且 有时已过时 的评级 分类标准 IE PICS http www w3 org PICS POWDER http www w3 org 2007 powder ICRA http www fosi org icr
  • 为什么 JSON.Parse 说“无效字符”?

    我在 IE 中运行了一段 JS 其中包含以下行 var data JSON parse skill SK AUTO DEV TEST kind IS REQUIRED 谁能告诉我这有什么问题吗 因为这不是有效的 JSON 您需要在属性名称周
  • 两列,100%高度固定流体

    不使用表格如何实现下面的效果呢 例子 http enstar nl example php http enstar nl example php 该示例目前可能不可见 名称服务器应该已更改 但我的主机更新它们的速度不是那么快 今天晚些时候应
  • AJAX (XMLHttpRequest) 进度监控不适用于 Service Workers

    我想将网络表单转换为离线工作 最初 我会在用户完成每个步骤后将表单信息存储在 Web 服务器上的 SQL 数据库中 其中一个步骤包括上传图像 为此我实现了一个进度条 添加服务工作者后 我注意到进度条不再起作用 进度条会显示 但永远不会更新以
  • 如何通过代码向 yaml 文件添加新条目

    我有 yaml 文件 我需要使用 go 代码在运行时向其中添加数据 路径就像下面这样 我的意思是 这是 yaml 文件 其下有一个条目sif of snk dev spec mec tolerations effect NoSchedule