舵模板多行秘密值

时间:2019-12-03 13:34:35

标签: bash kubernetes kubernetes-helm

我有一个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

1 个答案:

答案 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将以与两个单独的变量无法区分的方式打印此变量。