我有一个secret
对象的头盔模板:
...
data:
{{- range $key, $val := fromYaml .Values.secretmap }}
{{- $type := printf "%T" $val }}
{{ $key }}: {{ if eq $type "float64"}}{{ printf "%.0f" $val | b64enc | quote }}{{ else }}{{ $val | b64enc | quote }}{{ end }}
{{- end }}
kind: Secret
...
我将其加载如下:
helm template --set-file secretmap="secretmap.yaml"
我像这样从env var创建secretmap.yaml
:
env | sed -n "s/^K8S_SECRET_\(.*\)$/\1/p" | sed s/=/': '/ \ >secretmap.yaml
问题在于多行值。
当我将多行pem
键设置为env var时,只有第一行插入了secretmap.yaml
。
如何将多行env var正确加载到yaml
,以便掌舵可以创建其中的secret
?
答案 0 :(得分:1)
我会寻求比shell脚本更强大的工具来写出secretmap.yaml
文件。
Helm模板本身看起来不错。假设内容是有效的YAML,它将回显它,对每个值进行base64编码。如果YAML中的每个节点都是一个字符串,那么您会更快乐,这样您就不必基于动态类型查找来重新解释它。
因此实际的问题是生成YAML文件。您可以利用以下事实:(a)YAML努力使所有有效的JSON成为有效的YAML,并且(b)几乎每种编程语言在其标准库中都包括JSON支持。 (或者您也可以使用Helm的fromJson
函数。)这是一个最小的Python脚本,可以代替您的sed
命令来为您编写:
#!/usr/bin/env python3
import json
import os
PREFIX = 'K8S_SECRET_'
result = {}
for k in os.environ.keys():
if k.startswith(PREFIX):
kk = k[len(PREFIX):]
v = os.environ[k]
result[kk] = v
print(json.dumps(result))
或者,基于jq
的更密集的单线jq -n 'env | with_entries(select(.key | startswith("K8S_SECRET_")) | .key |= ltrimstr("K8S_SECRET_"))'
如果环境变量中嵌入了换行符,则使用基本的shell工具几乎不可能可靠地处理此换行符。作为最小示例,请尝试(特定于bash / zsh语法)
K8S_SECRET_FOO=$'bar\nK8S_SECRET_BAZ=quux' env
您只需要一个变量,但是使用嵌入的换行符,env
将以与两个单独的变量无法区分的方式打印此变量。