kubernetes - 使用 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
有没有一种干净的方法可以通过模板来做到这一点?
解决方案
首先,您必须了解有关字符串的 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
标志中的端口值作为列表(而不是字符串)。根据我在撰写此答案时的知识,要在--set
flag 中提供列表值,可以使用以下任一方法:
--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
. 而已。
您可能需要调整模板中的缩进
推荐阅读
- c# - 如何使用 TModel 和 IEnumerable 区分路由到相同的 POST 方法
在 ASP.NET 核心中 - scala - Kafka 消费者属性从一个主题开始
- kubernetes - 警告 kubernetes 部署不健康的 GCP
- google-chrome - 有什么方法可以阻止谷歌翻译(Chrome)中的特定语言
- python - 在python中读取多个excel文件
- bash - 如何使用 Bash 在文件中获取值
- javascript - 误报“检测到无法访问的代码.ts(7027)”?
- python-3.x - 即使我的 dag 已关闭,气流也会继续从我的函数创建文件
- python-3.x - pd.read_html-ValueError:未找到表
- java - JVMCFRE003 主要版本错误;class=org/postgresql/Driver, offset=6 同时将 db2 连接到 postgres