首页 > 解决方案 > yq - 添加多行字符串

问题描述

我正在使用 yq (类似于 jq 但用于 yaml 文件)。我的目标是做到以下几点。我有一个看起来类似于的证书文件

-------BEGIN CERTIFICATE-------
asdoqijepoqjwe1i49i120941p2j4omslasdajsdqweqwe
qwelqjwkasdlajsölkjasldkjakljsdlkjasdasdpiqwe
-------END CERTIFICATE--------

我有一个看起来像这样的 yaml 文件(在本例中为 Openshift 模板)

apiVersion: v1
kind: Template
objects:
- apiVersion: v1
  kind: Route
  tls:
   certificate:
   key:
  someOther: stuff

现在我的目标是将证书注入到 yaml 中,以便输出看起来像这样

apiVersion: v1
...
    certificate: |
      -------BEGIN CERTIFICATE-------
      asdoqijepoqjwe1i49i120941p2j4omslasdajsdqweqwe
      qwelqjwkasdlajsölkjasldkjakljsdlkjasdasdpiqwe
      -------END CERTIFICATE--------

然而,互联网搜索和文档都没有任何帮助。我得到的最接近的是使用

yq w /tmp/template.yaml objects[0].tls.certificate "\n$(cat cert.pem)"

给我以下输出

certificate: !!binary |
      fC0KLS0tLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0tLQphc2RvcWlqZXBvcWp3ZTFpND
      lpMTIwOTQxcDJqNG9tc2zDYXNkYWpzZMNxd2Vxd2UKcXdlbHFqd2vDYXNkbGFqc8O2bGtq
      YXNsZGtqYWtsanNkbGtqYXNkYXNkcGlxd2UKLS0tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS
      0tLS0t

奇怪的是,我想添加的那个的 base64 编码值前面是 !!binary |。任何想法发生了什么以及如何实现我想要的输出?

标签: bashbase64yamlyq

解决方案


我已经测试了@Inian 的建议yq3并且它有效。

也可以yq4使用以下语法来实现:

模板.yml

# template.yml
apiVersion: v1
kind: Template
objects:
  - apiVersion: v1
    kind: Route
    tls:
      certificate:
      key:
    someOther: stuff

证书.pem

-------BEGIN CERTIFICATE-------
asdoqijepoqjwe1i49i120941p2j4omslasdajsdqweqwe
qwelqjwkasdlajsölkjasldkjakljsdlkjasdasdpiqwe
-------END CERTIFICATE--------

命令

yq eval '.objects[0].tls.certificate = "'"$(< cert.pem)"'"' template.yml

输出

apiVersion: v1
kind: Template
objects:
  - apiVersion: v1
    kind: Route
    tls:
      certificate: |-
        -------BEGIN CERTIFICATE-------
        asdoqijepoqjwe1i49i120941p2j4omslasdajsdqweqwe
        qwelqjwkasdlajsölkjasldkjakljsdlkjasdasdpiqwe
        -------END CERTIFICATE--------
      key:
    someOther: stuff

推荐阅读