使用toYaml进行头盔模板化。

问题描述 投票:0回答:1

我有一个 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

有什么简单的方法可以用模板来实现吗?

kubernetes yaml kubernetes-helm
1个回答
0
投票

首先,你必须知道关于字符串的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. 就是这样。

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

© www.soinside.com 2019 - 2024. All rights reserved.