头盔内部使用头盔模板功能

时间:2020-04-09 13:48:47

标签: kubernetes-helm

我正在尝试在舵图上使用{{ template }}函数,但是在循环内,该值会出错。

首先是我的_helpers.tpl

{{- define "traefik.deployNamespace" -}}
    {{ default "kube-system" .Values.deployNamespace }}
{{- end -}}

我可以在所有模板上将变量与{{ template "treafik.deployNamespace }}一起使用,希望在循环内使用:

# Iterates on allowed namespaces and creates the roles
{{- if .Values.allowedNamespaces }}
{{- range .Values.allowedNamespaces }}
# Rules for namespace: {{ . }}
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: {{ . }}-traefik-ingress-r
  namespace: {{ . }}
rules:
  - apiGroups:
      - ""
    resources:
      - services
      - endpoints
      - secrets
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - extensions
    resources:
      - ingresses
    verbs:
      - get
      - list
      - watch

---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: {{ . }}-traefik-ingress-rb
  namespace: {{ . }}
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: {{ . }}-traefik-ingress-r
subjects:
- kind: ServiceAccount
  name: traefik-ingress-sa
  namespace: {{ template "traefik.deployNamespace" . }}
{{- end }}
{{- end }}

我可能做错了$ctx,但是我不知道该在其中使用什么。

> % helm template .
Error: template: traefik/templates/_helpers.tpl:62:36: executing "traefik.deployNamespace" at <.Values.deployNamespace>: can't evaluate field Values in type strin

1 个答案:

答案 0 :(得分:1)

在文件的底部,您可以使用.当前上下文变量。在{{ range }}...{{ end }}循环的上下文中,.被设置为要迭代的列表中的项目。

# `.` in all three of these is the same thing (a string)
name: {{ . }}-traefik-ingress-rb
namespace: {{ . }}
namespace: {{ template "traefik.deployNamespace" . }}

模板通常期望将顶级Helm环境对象作为其参数(具有"Charts""Values"等的字典类型对象)。您需要将其保存在循环外的变量中,以便可以访问它。

{{- $top := . }}
{{- range .Values.allowedNamespaces }}
...
  namespace: {{ template "traefik.deployNamespace" $top }}
...
{{- end }}