使用Helm命名模板构建字符串



我想利用helm图表中的命名模板来构建一个字符串,其值最终将是alb.ingress.kubernetes.io/certificate-arn的aws负载均衡器控制器注释,这只是一个逗号分隔的适用ACM证书列表。

在我的values.yaml中,我支持将附加证书覆盖为如下对象:

# in values.yaml as default
ingress.additional_certs: {}
# as an override of the above:
ingress.additonal_certs:
- arn: "arn:aws:acm:us-west-2:xxxxxxxxxxx:certificate/357ac969-643b-4424-a028-57183e02a765"
host: "somedomain.sub.com"
- arn: "arn:aws:acm:us-west-2:xxxxxxxxxxx:certificate/357ac969-643b-4424-a028-57183e02a764"
host: "someotherdomain.foo.com"

这个想法是,你可能会为每个域拥有不同的证书,这样最终用户就更容易跟踪什么去了什么。通过调用override";additional_certs";,因此使用了默认的ACM证书;additional_certs";只是附加到注释字符串上,并在ingress.spec.rules下正确枚举。

我很难理解的问题是如何获取一个基本字符串(在本例中为默认的ACM ARN(并在其上构建。从概念上讲,这只是一个简单的字符串构建练习,例如:

# in pseudocode
var cert_arns = "arn:aws:acm:us-west-2:xxxxxxxxxxx:certificate/357ac969-643b-4424-a028-57183e02a761"
cert_arns += "," + ingress.additional_certs.arn[0]
# so cert_arns ostensibly becomes "arn:aws:acm:us-west-2:xxxxxxxxxxx:certificate/357ac969-643b-4424-a028-57183e02a761,arn:aws:acm:us-west-2:xxxxxxxxxxx:certificate/357ac969-643b-4424-a028-57183e02a765"

坦率地说,我甚至不知道如何使用命名模板来尝试这样做。使用range的大多数示例倾向于在类似于labels的yaml中进行循环填充。如何简单地在一个范围内迭代并跟踪值(在这种情况下,它类似于range $k, $v := .Values.ingress.additional_certs,所以$v.arn(根本没有点击,我也没有偶然发现任何创建字符串的例子。

如果有更好的方法来实现这一点,那不是一个命名的模板,我会洗耳恭听。

Helm有"列表";以及";字典";,但并没有太多的操作函数可以对它们起作用。例如,您可以想象想要构建一个所有arn值的列表,然后用逗号将该列表连接在一起,但对于动态长度列表,这有点超出了Helm的扩展函数所提供的范围。

对于一个足够短的列表(在values.yaml文件中配置的几个项目就可以了(,您可以编写一个递归函数。请记住,Helm模板不会";返回值">本身,它们输出文本,include收集该输出文本。你可以写一个递归模板,比如:

{{- define "cert-arns" -}}
{{- if . -}}
{{- (first .).arn -}}
{{- include "cert-arns.more" (rest .) -}}
{{- end -}}
{{- end -}}
{{- define "cert-arns.more" -}}
{{- if . -}}
,{{- (first .).arn -}}
{{- include "cert-arns.more" (rest .) -}}
{{- end -}}
{{- end -}}
{{- include "cert-arns" (index .Values "ingress.additional_certs") -}}

注意倒数第四行的逗号;这不是打字错误。为了清晰起见,我已经缩进了所有内容,但也注意到大括号内的-抑制了所有空白。

相关内容

  • 没有找到相关文章