YAML:从字符串到多行?

YAML: from string to multi-line?

我有一个像这样的 yaml。

有没有办法让“Corefile”的值变成多行的?

apiVersion: v1
data:
  Corefile: ".:53 {\n    rewrite name regex (.*)\.test\.io {1}.default.svc.cluster.local \n    errors\n    health {\n       lameduck 5s\n    }\n    ready\n    kubernetes cluster.local in-addr.arpa ip6.arpa {\n       pods insecure\n       fallthrough in-addr.arpa ip6.arpa\n       ttl 30\n    }\n    prometheus :9153\n    forward . /etc/resolv.conf {\n       max_concurrent 1000\n    }\n    cache 30\n    loop\n    reload\n    loadbalance\n}\n"
kind: ConfigMap
metadata:
  creationTimestamp: "2022-02-25T12:36:15Z"
  name: coredns
  namespace: kube-system
  resourceVersion: "14874"
  uid: dc352ab8-1e43-4663-8c6a-0d404f4bb4f3

我尝试了 yq -P,但这并没有帮助

基本命令是这样的(e新版本可以省略):

yq e '.data.Corefile style="literal"' test.yaml

但是这在您的情况下不起作用,因为 YAML 表示尾随白色space 被忽略,因此您不能将带有尾随白色space 的数据格式化为文字块标量。您数据的相关部分是:

default.svc.cluster.local \n
                         ^

这个space好像不相关,所以你可以写额外的代码来删除它:

yq e '.data.Corefile |= sub("\s*(\n)", "") | .data.Corefile style="literal"' test.yaml

(有一个奇怪的错误,我不能直接用 "\n" 替换,因为出于某种原因,这会在数据中创建 "\n",所以我改用捕获的换行符。)

结果:

apiVersion: v1
data:
  Corefile: |
    .:53 {
        rewrite name regex (.*)\.test\.io {1}.default.svc.cluster.local
        errors
        health {
           lameduck 5s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf {
           max_concurrent 1000
        }
        cache 30
        loop
        reload
        loadbalance
    }
kind: ConfigMap
metadata:
  creationTimestamp: "2022-02-25T12:36:15Z"
  name: coredns
  namespace: kube-system
  resourceVersion: "14874"
  uid: dc352ab8-1e43-4663-8c6a-0d404f4bb4f3