如何在 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
。
我在 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
。