6

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

4

2 回答 2

2

我已经测试了@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
于 2021-04-13T00:32:07.917 回答
2

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

要获取|(包括尾随的新行),您需要:

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

免责声明:我写了 yq

于 2021-12-05T01:12:12.120 回答