如何解决使用yq解析属性文件数据模型
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 举报,一经查实,本站将立刻删除。