如何使用范围函数将值保持在掌舵的同一行

How to use range function to keep values in same line in helm

我正在尝试根据 values.yaml 中的值构建配置映射数据。

CASE 1:
values.yaml:
  dns_domains: abc xyz 
  dns_servers: IP1 IP2 IP3

我想要 configmap 数据如下 values.yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  name: Corefile
data:
   abc:53 {
     log
     errors
     cache 30
     forward . IP1 IP2 IP3
   }
   xyz:53 {
     log
     errors
     cache 30
     forward . IP1 IP2 IP3
   }
CASE 2:
values.yaml:
  dns_domains: abc xyz 
  dns_servers: 
or 
  dns_domains: abc xyz 

我想要 configmap 数据如下 values.yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  name: Corefile
data:
   abc:53 {
     log
     errors
     cache 30
   }
   xyz:53 {
     log
     errors
     cache 30
   }

我尝试了下面的方法,但遇到了如何使“前向”行的所有值都在范围内的问题

{{- range $domain := splitList " " .Values.dns_int_domains }}
  $domain:53 {
    log
    errors
    cache 30
    {{- range $dns_int_server := splitList " " .Values.dns_int_servers }}
    {{- if $dns_int_server }}
    forward . $dns_int_server  # how to make this line to have all values in dns_int_server list
    {{- end }}
    }
{{- end }}

注意:我们应该在一个服务器块中只有一个转发插件。即,以下是不允许的

abc:53 {
  forward . IP1
  forward . IP2
}

如果有人帮助我,我将不胜感激。提前致谢!!!

根据您当前的格式,.Values.dns_servers 已经是一个具有 space-separated 值的字符串,这就是您想要的格式。你不需要把它拆分成一个列表再写出来。

{{- if .Values.dns_servers }}
forward . {{ .Values.dns_servers }}
{{- end }}

Helm 包含(几乎所有)Sprig library, not all of which are in the Helm documentation proper. If you do have this as a list, there is a join 模板函数中的扩展函数,可以将它们组合在一起。

{{- $dns_servers := splitList " " .Values.dns_servers }}
{{- if $dns_servers }}
forward . {{ join " " $dns_servers }}
{{- end }}

如果您在 values.yaml 文件中使用本机 YAML 列表,您可能会发现操作这些值比 space-separated 字符串更容易。任何有效的 YAML 列表语法都可以在这里使用,包括将整个列表放在一行的格式。

# values.yaml, reformatted to use YAML lists and snakeCase names
dnsDomains: [abc,xyz]
dnsServers:
  - 10.10.10.10
  - 10.10.10.11
  - 10.10.20.20

作为最后一个选项,如果您对白色space 处理非常小心,您可以将模板放在任何您想要的地方,甚至在一行的中间。

{{- with .Values.dnsServers }}
forward .
{{- range . }} {{ . }}{{ end }}
{{- end }}

最后一个示例的重要技巧是 - whitespace 控件在 range 之前也消耗了上一行末尾的换行符。然后在 range 块内,每个元素重复一次并且没有白色 space 控件,有一个 space 和一个列表元素。最后在最后一个 end 之后有一个换行符。

你可以 double-check 使用 helm template,这将验证 YAML 语法并打印出呈现的内容(使用 --debug 它会打印出来,即使它是无效的 YAML) .