如何在 Vault 中将 JSON secret 解析为 YAML?

How to parse a JSON secret to YAML in Vault?

我在 Vault 中有一个秘密,它实际上是 JSON 的“复杂”结构,这意味着它不仅仅是一个 key/value,而是在不同的子级别上有几个密钥。

我需要以某种方式获取这个秘密并将其转换为 JSON 的 YAML 表示形式。如果它是一个简单的结构(比如几个 k/v 在同一级别),我可以使用像

这样简单的东西
      {{- with secret "secret/foo" -}}
          {{ range $k, $v := .Data.data }}
            {{ $k }}: {{ $v }}
          {{- end }}
      {{- end }}

然而,由于情况并非如此,而且 JSON 的结构很复杂,因此很难想出一个模板。

但是,我发现 Vault 使用了 Consul 模板,而 Consul 有一个 parseYAML 函数,所以我的问题是,我怎样才能模板化它,以便我得到 .Data.data 的所有内容并将其翻译成 YAML ?

我尝试了几种类似于下面这种方法的方法:

{{- with secret "secret/foo" -}}
{{ .Data.data| parseYAML }}
{{- end }}

但我总是遇到同样的错误wrong type for value; expected string; got map[string]interface {}"

更新

示例 yaml:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: app
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  selector:
    matchLabels:
      app: app
  template:
    metadata:
      labels:
        app: app
      annotations:
        vault.hashicorp.com/agent-inject: 'true'
        vault.hashicorp.com/agent-inject-secret-foo: 'secret/foo'
        vault.hashicorp.com/agent-inject-template-secret-foo: |
          {{- with secret "secret/foo" -}}
          {{ .Data.data| parseYAML }}
          {{- end }}
        vault.hashicorp.com/role: 'app'
    spec:
      containers:
        - name: app
          image: 'app:1.0.0'
      serviceAccountName: app

其中 secret/foo 是一个很长的 JSON,没有清晰的结构。一个随机示例(我认为实际 JSON 大约是 300 行)。

{
  "a": {
    "a": "a",
    "b": "b",
    "c": {
      "a": "a",
      "b": {
        "c": "c"
      },
      "d": "a"
    },
    "e": {
      "a": {
        "b": {
          "c": {
            "a": "a",
            "b": "b"
          }
        }
      }
    }
  }
}

好吧,想想这个吧。

{{- with secret "secret/foo" -}}
{{ .Data.data| parseYAML }}
{{- end }}

这是正确的,但是 parseYAML 正确的函数是 toYAML