0

我有一个像这样的 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"
4

1 回答 1

1

问题是:

  • |是 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为(第 4 行)的内容NEW_VALUE,将结果存储在UPDATED_CONTENT(第 2 行)中,然后再次调用将值更新为(第 4行)yq的内容UPDATED_CONTENT5)。

于 2021-06-26T12:02:05.640 回答