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. 就是这样。
您可能需要调整模板中的缩进