gpt4 book ai didi

kubernetes - yq - 将 yaml 添加到 yaml 的问题

转载 作者:行者123 更新时间:2023-12-04 14:02:08 29 4
gpt4 key购买 nike

嗨,我想将类似 yaml 的字符串更新为 yaml
我确实有以下 yaml 文件 argocd.yaml

---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
namespace: mynamespace
name:my-app
spec:
project: xxx
destination:
server: xxx
namespace: xxx
source:
repoURL: xxx
targetRevision: dev
path: yyy
helm:
values: |-
image:
tag: "mytag"
repository: "myrepo-image"
registry: "myregistry"
最终我想替换标签的值。不幸的是,这是 yaml 配置中的 yaml。
到目前为止我的想法是:
  • 将值提取到另一个 values.yaml
  • 更新标签
  • 使用 values.yaml 评估 argocd.yaml 中的值
    所以有效的是:
  • # get the yaml in the yaml and save as yaml
    yq e .spec.source.helm.values argocd.yaml > helm_values.yaml
    # replace the tag value
    yq e '.image.tag=newtag' helm_values.yaml
    然后我想添加 helm_values.yaml 的内容文件作为字符串放入 argocd.yaml我尝试了以下操作,但无法正常工作
    # idea 1
    ###################
    yq eval 'select(fileIndex==0).spec.source.helm.values = select(fileIndex==1) | select(fileIndex==0)' argocd.yaml values.yaml

    # this does not update the values but add back slashes

    values: "\nimage:\n tag: \"mytag\"\n repository: \"myrepo-image\"\n registry: \"myregistry\""

    # idea 2
    ##################
    yq eval '.spec.source.helm.values = "'"$(< values.yaml)"'"' argocd.yam

    here i am not getting the quite escape correctly and it fails with

    Error: Parsing expression: Lexer error: could not match text starting at 2:9 failing at 2:12.
    unmatched text: "newtag"

    知道如何解决这个问题还是有更好的方法来替换此类文件中的值?
    我正在使用来自 https://mikefarah.gitbook.io/yq 的 yq

    最佳答案

    你的第二种方法可以工作,但以一种迂回的方式,如 mikefarah/yq不支持更新 multi-line block literals然而
    使用现有结构解决此问题的一种方法是在下面执行,而无需创建临时 YAML 文件

    o="$(yq e '.spec.source.helm.values' yaml | yq e '.image.tag="footag"' -)" yq e -i '.spec.source.helm.values = strenv(o)' argocd.yaml
    上面的解决方案依赖于 passing a user defined variable作为字符串,可以使用 strenv() 在 yq 表达式中使用.变量 o 的值使用 Command substitution $(..) 设置bash 中的功能。在替换结构中,我们将块文字内容提取为 YAML 对象,并根据需要应用另一个过滤器来修改标签。所以在替换结束时, o 的值将被设置为
    image:
    tag: "footag"
    repository: "myrepo-image"
    registry: "myregistry"
    上面获得的结果现在设置为值 .spec.source.helm.values直接使用就地修改标志 ( -i ) 将更改应用于实际文件

    我在作者的 repo 中提出了一个功能请求,以提供一种更简单的方法来做到这一点 Support for updating YAML multi-line strings #974

    关于kubernetes - yq - 将 yaml 添加到 yaml 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69648216/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com