yq - 添加多行字符串

yq - add a multiline string

我正在使用 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 |。知道发生了什么以及如何实现我想要的输出吗?

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

也可以在yq4中实现,语法如下:

template.yml

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

cert.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

请注意,在 bash 中,当您使用“$(..)”时,它将 trim 尾随换行符(这就是为什么 yaml 字符串块以 |- 开头而不是|.

要获得 |(包括结尾的新行),您需要:

IFS= read -rd '' output < <(cat cert.pem)
output=$output yq e '.objects[0].tls.certificate = strenv(output)' myfile.yml

免责声明:我写了yq