将YAML字符串转换为Helm模板中的dict

时间:2019-03-25 19:46:53

标签: go kubernetes-helm

我正在为一个项目创建一个图表,该项目的二进制文件在执行时会生成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循环来进行这些更改?

2 个答案:

答案 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 -}}

将Yaml字典转换为类似属性的外观

{{- 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 }}

使用(来自K8s configMap的示例)

{{- 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 }}