configmap 中的 Helm tpl 函数无法解析 yaml 文件内容

问题描述 投票:0回答:1

我有一个应用程序需要从给定路径读取多个 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 }}
),但我从未摆脱该错误。

有什么帮助吗?

kubernetes kubernetes-helm configmap gitops
1个回答
0
投票

我发现了问题。

这就是我最终让它按我的预期工作的方式:

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 返回一个字节数组)。

© www.soinside.com 2019 - 2024. All rights reserved.