【问题标题】:Convert YAML string to dict in Helm template在 Helm 模板中将 YAML 字符串转换为 dict
【发布时间】:2020-05-21 01:59:12
【问题描述】:

我正在为一个项目创建一个图表,该项目有一个二进制文件,执行时会生成一个 YAML 格式的配置文件,如下所示:

---
PARAM_1: value1
PARAM_2: value2

我的图表需要读取此文件并将其所有值加载到容器中的环境变量中,因此我在我的 values.yaml 文件中创建了一个变量 config 并在安装图表时传递文件内容使用--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 循环进行这些更改?

【问题讨论】:

  • Search GitHub 用于使用您的语言与您感兴趣的格式进行交互的包/库。
  • 此外,Go 模板遵循与其他 Go 包相同的规则:它看不到不以 rune Unicode 定义为大写字母开头的结构字段。您需要将字段命名为 Config 而不是 config 才能在模板中使用它。
  • 感谢@JesseAmano 的提示。我阅读了一堆 Helm 图表,但没有看到任何与我正在寻找的相似的东西。关于configConfig 的情况,它可能是特定于helm 的,但该变量是称为Value 的外部变量的一部分,所以那里没有问题。

标签: go kubernetes-helm


【解决方案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 . 在这部分有很大帮助。

这有点乱,所以我很想看看是否有人有更好的解决方案。

【讨论】:

    【解决方案2】:

    如果您需要使用更棘手的 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 dict 转换为类似属性的外观

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

    【讨论】:

      猜你喜欢
      • 2021-06-13
      • 2020-10-07
      • 1970-01-01
      • 2020-05-27
      • 1970-01-01
      • 2015-05-24
      相关资源
      最近更新 更多