我有一个应用程序需要从给定路径读取多个 YAML 文件。
此路径通过 K8s ConfigMap 填充,该 ConfigMap 通过 Helm 进行模板化,以从配置目录中获取所有文件 base-yaml,并且必须在每个文件中应用 tpl 函数来填充应用程序特定的信息。
结构如下: 我的 gitops 仓库中有一个目录
config
和 file_1.yaml
和 file_2.yaml
file_1.yaml
的内容是这样的:
block_1:
my_var: "{{ .Values.my_var }}"
something: "something"
block_2:
aws_region: "{{ .Values.aws_region}}"
block_3:
my_composite_var: "fixed_prefix-{{ .Values.moving_prefix }}-{{ .Values.some_value }}"
complex_json: "...[some complex entry with escaped quotes etc]"
我创建了一个配置映射 helm 模板,如下所示,以列出
config
目录中的任何文件:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Values.configMapName }}
labels:
app: {{ .Release.Name }}
data:
{{- $files := .Files.Glob (printf "%s/*" .Values.dirName) }}
{{- range $path, $file := $files }}
{{ base $path }}: |
{{ $file | toString | indent 4 }}
{{- end }}
到目前为止它可以工作,但我没有应用任何模板,并且我的 pod 中的映射文件将是 yaml 文件的逐字内容。 当我用任何适用的
{{ $file | toString | indent 4 }}
替换 tpl
时,就会出现问题:
{{ tpl ($file | toString) . | indent 4 }}
=> Error template: gotpl:9: bad character U+002D '-'
我尝试了几种组合(例如
{{ tpl (quote $file | toString) . | indent 4 }}
甚至{{ tpl (b64enc $file | toString) . | b64dec | indent 4 }}
),但我从未摆脱该错误。
有什么帮助吗?
我发现了问题。
这就是我最终让它按我的预期工作的方式:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Values.configMapName }}
labels:
app: {{ .Release.Name }}
data:
{{- range $path, $bytes := .Files.Glob "config/*.yaml" }}
{{ base $path }}: |
{{ tpl (toString $bytes | indent 2) $ | indent 4 }}
{{- end }}
技巧在于 .Files.Glob 之前的范围,以及文件值的
toString
(因为 Glob 返回一个字节数组)。