首页 > 解决方案 > 使用 toYaml 进行 helm 模板化

问题描述

我有 values.yml 文件,其中包含具有这种格式和默认值的端口列表:

Ports:
  - number: 443
    protocol: http

输出端口列表以用作我的输入的脚本为我提供了以下格式:

port_list=$(./get_ports.sh)

输出:

- 80
- 8080

我希望生成的渲染模板是

Ports:
  - number: 80
  - number: 8080

我将如何做到这一点?我在我的模板文件中尝试了以下内容:

{{- with .Values.Ports }}
Ports:
  {{- toYaml . | nindent 8 }}
{{- end }}

使用 helm template 和 setting values.Ports=$port_list,它最终给了我一个管道和一个额外的破折号,如下所示,我不知道它们来自哪里,我如何根据输入完成获取上面想要的格式?

Ports:
|-
  - number: 80
  - number: 8080

作为奖励,当未指定协议时,我还希望在我的端口列表中有一个默认协议。

Ports:
  - number: 80
    protocol: http
  - number: 8080
    protocol: http

有没有一种干净的方法可以通过模板来做到这一点?

标签: kubernetesyamlkubernetes-helm

解决方案


首先,您必须了解有关字符串的 YAML 语法。你可以通过在互联网上搜索找到它。例如:请参阅YAML 多行

|启用多行字符串并从字符串-末尾截断尾随\n

出现的原因|-是脚本的输出get_ports.sh(被视为单个字符串)。你可以测试一下,

port_list=$(get_ports.sh)
# pass this to the `--set` flag in both of the following ways
# 01: pass the var $port_list
--set ports=$port_list
# 02: directly pass the value of the var $port_list
--set ports="- 80
- 8080"

对于这两个测试,您具有相同的输出,如下所示:

ports:
|-
  - 80
  - 8080

如果您在脚本输出的末尾添加一个换行符,那么您会看到-已消失。

--set ports="- 80
- 8080
"

输出如下:

ports:
|
  - 80
  - 8080

现在尝试不同的方式。将您的模板更改为喜欢这个:

{{- if .Values.ports }}
  {{- print "ports:" | nindent 2 }}
  {{- range $_, $p := .Values.ports }}
    - number: {{ $p }}
      protocol: http
  {{- end }}
{{- end }}

此模板需要将--set标志中的端口值作为列表(而不是字符串)。根据我在撰写此答案时的知识,要在--setflag 中提供列表值,可以使用以下任一方法:

  • --set ports={80\,8080}
  • --set ports[0]=80,ports[1]=8080

现在输出与您想要的相同。

$ helm template test . --set ports={80\,8080}
ports:
  - number: 80
    protocol: http
  - number: 8080
    protocol: http

因此,您只需要处理get_ports.sh. 而已。

您可能需要调整模板中的缩进


推荐阅读