我在Vault中有一个秘密,它真的很"复杂"。JSON的结构,这意味着它不仅仅是一个键/值,而是在不同的子级别有几个键。
我需要以某种方式获得这个秘密并将其转换为该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| toYAML }}
{{- end }}
这是正确的,但正确的函数不是parseYAML
,而是toYAML
。