我有一个 values.yml 文件,它接收了一个具有这种格式和默认值的 port 列表。
Ports:
- number: 443
protocol: http
脚本输出的端口列表是这样的格式:
port_list=$(./get_ports.sh)
output:
- 80
- 8080
我希望输出的模板是
Ports:
- number: 80
- number: 8080
我如何实现这个目标?我在我的模板文件中尝试了以下方法。
{{- with .Values.Ports }}
Ports:
{{- toYaml . | nindent 8 }}
{{- end }}
使用头盔模板和设置 values.Ports=$port_list
,最后给了我一个管道和一个额外的破折号,就像下面的一样,我不知道它们是从哪里来的,我如何实现根据输入得到上面我想要的格式?
Ports:
|-
- number: 80
- number: 8080
另外,我还想在没有指定协议的时候,在我的端口列表里有一个默认协议。
Ports:
- number: 80
protocol: http
- number: 8080
protocol: http
有什么简单的方法可以用模板来实现吗?
首先,你必须知道关于字符串的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 }}
这个模板期望您的 ports 的值在 the --set
标志为一个列表(而不是字符串)。根据我写这篇回答时的知识,要在 --set
标志,可以使用下面的任何一个。
--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
. 就是这样。
你可能需要调整模板中的缩进。