如何将 helm printf 输出评估为 jinja 表达式

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

根据节点数量,我需要引用yaml文件中的证书和密钥。

{{- $root := . -}}
{{ range $k, $v := until (int ($root.Values.data.nodeCount) ) }}
apiVersion: v1
kind: Secret
metadata:
  name: {{ $root.Values.clusterName }}-nodes-{{$k}}-secret
type: Opaque
data:
  crt: {{ printf "$root.Values.data.node_%d_key" $k }}
---
{{- end }}

示例输出:它不显示输出值,仅显示 printf 输出(字符串),我如何评估 printf 输出以获取评估以从values.yaml 检索结果

---
apiVersion: v1
kind: Secret
metadata:
  name: test-nodes-0-secret
type: Opaque
data:
  crt: $root.Values.data.node_0_key
---
apiVersion: v1
kind: Secret
metadata:
  name: test-nodes-1-secret
type: Opaque
data:
  crt: $root.Values.data.node_1_key

示例值.yml

nodeCount: 3
clusterName: "test"
data: 
  nodeCount: 2
  node_0_crt: "test"
  node_0_key: "test"
  node_1_crt: "test1"
  node_1_key: "test1"
kubernetes-helm
1个回答
0
投票

请注意,Helm 不使用 Jinja 模板语法。如果您尝试在 Helm 模板中使用 Jinja 表达式,它将无法工作。 Helm 使用 Go 模板(带有一堆自定义函数)。


对于您想要的行为,我认为您正在寻找

tpl
函数,它可以让您将字符串评估为 Helm 模板。可能看起来像这样:

{{ range until (int $.Values.data.nodeCount) }}
apiVersion: v1
kind: Secret
metadata:
  name: {{ $.Values.clusterName }}-nodes-{{.}}-secret
type: Opaque
data:
  crt: {{ tpl (printf "{{ .Values.data.node_%d_key }}" .) $ }}
---
{{- end }}

请注意,我还删除了您对

$root
的使用;如果您需要显式引用根上下文,则只需引用
$
变量即可。我还稍微简化了外部
range
循环。

鉴于上述模板和您的示例数据,我得到以下输出:

---
# Source: example/templates/secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: test-nodes-0-secret
type: Opaque
data:
  crt: test
---
# Source: example/templates/secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: test-nodes-1-secret
type: Opaque
data:
  crt: test1
© www.soinside.com 2019 - 2024. All rights reserved.