使用 toYaml 进行掌舵模板

Jim*_*ith 6 yaml kubernetes kubernetes-helm

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

Ports:
  - number: 443
    protocol: http
Run Code Online (Sandbox Code Playgroud)

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

port_list=$(./get_ports.sh)

输出:

- 80
- 8080
Run Code Online (Sandbox Code Playgroud)

我希望生成的渲染模板是

Ports:
  - number: 80
  - number: 8080
Run Code Online (Sandbox Code Playgroud)

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

{{- with .Values.Ports }}
Ports:
  {{- toYaml . | nindent 8 }}
{{- end }}
Run Code Online (Sandbox Code Playgroud)

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

Ports:
|-
  - number: 80
  - number: 8080
Run Code Online (Sandbox Code Playgroud)

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

Ports:
  - number: 80
    protocol: http
  - number: 8080
    protocol: http
Run Code Online (Sandbox Code Playgroud)

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

Shu*_*rma 11

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

|启用多行字符串并-截断\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"
Run Code Online (Sandbox Code Playgroud)

对于这两个测试,您将获得相同的输出,如下所示:

ports:
|-
  - 80
  - 8080
Run Code Online (Sandbox Code Playgroud)

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

ports:
|-
  - 80
  - 8080
Run Code Online (Sandbox Code Playgroud)

输出如下:

ports:
|
  - 80
  - 8080
Run Code Online (Sandbox Code Playgroud)

现在尝试用不同的方式。将您的模板更改为如下所示:

{{- if .Values.ports }}
  {{- print "ports:" | nindent 2 }}
  {{- range $_, $p := .Values.ports }}
    - number: {{ $p }}
      protocol: http
  {{- end }}
{{- end }}
Run Code Online (Sandbox Code Playgroud)

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

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

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

--set ports="- 80
- 8080
"
Run Code Online (Sandbox Code Playgroud)

因此,您只需要处理get_ports.sh. 就是这样。

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