我正在为一个项目创建一个图表,该项目的二进制文件在执行时会生成YAML格式的配置文件,如下所示:
---
PARAM_1: value1
PARAM_2: value2
我的图表需要读取该文件并将其所有值加载到容器中的环境变量中,因此我在config
文件中创建了一个变量values.yaml
,安装图表后使用--set-file
传递文件内容:
helm install <CHART> --set-file config=/path/to/yaml/config/file
接下来,我用值ConfigMap
创建一个.Values.config
:
apiVersion: v1
kind: ConfigMap
metadata:
...
data:
{{ .Values.config }}
我遇到的问题是我需要用config
的值做两件事:
MY_APP_PARAM_1
作为键)ConfigMap
将失败如何将模板中的.Values.config
的值解析为dict
,以便可以使用range
循环来进行这些更改?
答案 0 :(得分:1)
最后,我能够执行以下操作:
{{ $lines := splitList "\n" .Values.config -}}
{{- range $lines }}
{{- if not (. | trim | empty) -}}
{{- $kv := . | splitn ":" 2 -}}
{{ printf "MY_APP_%s: %s" $kv._0 ($kv._1 | trim | quote) | indent 2 }}
{{ end -}}
{{- end -}}
我很难弄清{{-
与{{
,而helm install --debug --dry-run .
在这部分中有很大帮助。
有点乱,所以我很想看看是否有人有更好的解决方案。
答案 1 :(得分:0)
如果您需要使用更复杂的YAML(地图中的地图),则可以使用以下方法:
{{- define "helm-toolkit.utils.joinListWithComma" -}}
{{- $local := dict "first" true -}}
{{- range $k, $v := . -}}{{- if not $local.first -}}, {{ end -}}{{ $v -}}{{- $_ := set $local "first" false -}}{{- end -}}
{{- end -}}
{{- define "utils.yaml2properties" }}
{{- $yaml := . -}}
{{- range $key, $value := $yaml }}
{{- if kindIs "map" $value -}}
{{ $top:=$key }}
{{- range $key, $value := $value }}
{{- if kindIs "map" $value }}
{{- $newTop := printf "%s.%s" $top $key }}
{{- include "utils.yaml2properties" (dict $newTop $value) }}
{{- else if kindIs "slice" $value }}
{{ $top }}.{{ $key }}={{ include "helm-toolkit.utils.joinListWithComma" $value }}
{{- else }}
{{ $top }}.{{ $key }}={{ $value }}
{{- end }}
{{- end }}
{{- else if kindIs "slice" $value }}
{{ $key }}={{ include "helm-toolkit.utils.joinListWithComma" $value }}
{{- else }}
{{ $key }}={{ $value }}
{{- end }}
{{- end }}
{{- end }}
{{- define "config.yaml" }}
vault.pki:
enabled: {{.Values.vault.pki.enabled}}
role: idverify
common-name: idverify
role:
map:
list:
- one
- two
{{- end }}
data:
bootstrap.properties: |
{{ (include "utils.yaml2properties" (include "config.yaml" . | fromYaml )) | indent 4 }}