微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用yq解析属性文件数据模型

如何解决使用yq解析属性文件数据模型

我有一个这样的 YAML 文件

apiVersion: "v1alpha1"
kind: "Druid"
Metadata:
  name: druid-dev-cluster
spec:
  common.runtime.properties: |
    # Zookeeper
    druid.zk.service.host=cluster-zk-0.cluster-zk
    druid.zk.paths.base=/druid
    druid.zk.service.compress=false

我想替换 common.runtime.properties 中的属性之一。这是否支持使用 yq? 当我正常尝试时失败

property=.spec.common.runtime.properties.druid.zk.service.host=cluster-zk-0.cluster-zk
OVERLAY= deploy/overlays/aws/common-runtime-properties.yaml
yq e "${property}" "$OVERLAY"/"$propertyType"

Error: Parsing expression: Lexer error: Could not match text starting at 1:55 failing at 1:57.
        unmatched text: "ti"

这适用于其他属性,例如

apiVersion: "v1alpha1"
kind: "Druid"
Metadata:
  name: druid-dev-cluster
spec:
  nodes:
    brokers:
      nodeType: "broker"
      druid.port: 8088
      ingressAnnotations:
        kubernetes.io/ingress.class: "plb.v1"

解决方法

问题是:

  • | 是一个 YAML 文字块标量。就 YAML 而言,它的内容是单个标量,因此您无法从 yq 中路径选择。
  • 另外,| 的内容不是 YAML,而是可能被解析为 Java 属性文件。因此,即使在标量上递归调用 yq,您也无法解析它。
  • 另外,标量的路径不是.spec.common.runtime.properties而是.spec."common.runtime.properties"——注意第二部分是如何写成YAML内容中的单个标量的,这并不等同于有多个子映射(尽管一些 Java 人似乎相信这一点)。

话虽如此,你当然可以做类似的事情

export NEW_VALUE=droggeljug
UPDATED_CONTENT=$(\
    yq e '.spec."common.runtime.properties"' test.yaml | \
    sed -re 's/(druid.zk.service.host=)[^\n]*/\1'"$NEW_VALUE"'/g' \
) yq e '.spec."common.runtime.properties" = strenv(UPDATED_CONTENT)' test.yaml

这使用 yq 选择包含属性的标量(第 3 行),使用 sed 将值 druid.zk.service.host 更新为 NEW_VALUE 的内容(第 4 行) ,将结果存储在 UPDATED_CONTENT(第 2 行)中,然后再次调用 yq 将值更新为 UPDATED_CONTENT 的内容(第 5 行)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。