【发布时间】:2021-11-22 21:51:22
【问题描述】:
我在 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"
}
}
}
}
}
}
【问题讨论】:
-
您的
.Data.data是 HCL2 映射还是 JSON 字符串? -
@MattSchuchard 我在 Vault 中存储了一个 JSON,但是一旦检索到秘密,输出肯定不是 JSON。它遵循如下格式:
key:map[key:map[key:value] key2:value key3:map[key4:map[....... -
我不确定这是否是您所指的 HCL2 格式。基本上是一个 JSON,其中
{替换为map[,,替换为空格。 -
这听起来像 HCL2 Map,它可以用
parseYAML正确转换为 YAML。我推测您的 Kubernetes 清单需要一个字符串类型的值,而您没有传递一个字符串。看到 1. 你的秘密的结构 2. Kubernetes manifest sn-p 都会减少猜测的数量。 -
@MattSchuchard 这个秘密真的很大,它本身并不是真正的“秘密”,但由于应用程序设计不佳,开发人员将秘密与标准设置混为一谈。因此,只需假设一个没有清晰结构的随机 JSON,例如
{"a":{"a":"a","b":"b","c":{"a":"a","b":{"c":"c"},"d":"a"},"e":{"a":{"b":{"c":{"a":"a","b":"b"}}}}}}。 Kubernetes 的 yaml 没有什么特别的,标准 Pod 定义带有 Vault 的 annocations 来读取秘密。
标签: kubernetes consul hashicorp-vault