如何不带头盔(去)模板使用功能?

时间:2020-05-27 06:24:29

标签: kubernetes-helm go-templates

我正在使用Helm在我们的kubernetes集群上部署名称空间。

这是模板:

{{- range $namespaces := .Values.namespaces }}
{{- if ne $namespaces.name "default" }}    
apiVersion: v1
kind: Namespace
metadata:
  name: {{ $namespaces.name }}
  labels:
    name: {{ $namespaces.name }}
{{- end }}

值文件:

namespaces:
  - name: default
  - name: ingress-controller
  - name: rbac-manager
  - name: velero
  - name: test1
  - name: test2
  - name: test3

这很好,但是现在我想为某些名称空间设置一个特定的标签。默认情况下,入口控制器,rbac-manager和velero是我不想为其设置标签的名称空间,而仅是针对特定于团队的名称空间。在这种情况下,测试{1,2,3}。但是这些变量。 因此,不要使用has函数:

{{ if has .Values.favorite.drink (list "coffee" "thee" "milk") }}mug: true{{ end }}

我想使用no函数,但是我做错了,所以希望有人可以帮助我解决这个问题:

{{- range $namespaces := .Values.namespaces }}
{{- if ne $namespaces.name "default" }}    
apiVersion: v1
kind: Namespace
metadata:
  name: {{ $namespaces.name }}
  labels:
    name: {{ $namespaces.name }}
{{ $custom := without $namespaces.name "default" "ingress-controller" "rbac-manager" "velero" }}
{{- if eq $custom.name }}
    namespace: custom
{{- end }}
---
{{- end }}
{{- end }}

运行此命令时出现错误:

Error: UPGRADE FAILED: template: namespaces/templates/namespaces.yaml:10:14: executing "namespaces/templates/namespaces.yaml" at <without $namespaces.name "default" "ingress-controller" "rbac-manager" "velero">: error calling without: Cannot find without on type string

使用时出现相同错误:

{{- range $namespaces := .Values.namespaces }}
{{- if ne $namespaces.name "default" }}    
apiVersion: v1
kind: Namespace
metadata:
  name: {{ $namespaces.name }}
  labels:
    name: {{ $namespaces.name }}
{{ $custom := without $namespaces.name (list "default" "ingress-controller" "rbac-manager" "velero") }}
{{- if eq $custom.name }}
    namespace: custom
{{- end }}
---
{{- end }}
{{- end }}

3 个答案:

答案 0 :(得分:0)

我知道让它与不带功能一起使用并不是真正的答案,但是我可以与它一起使用:

{{ range $namespaces := .Values.namespaces }}
{{ if ne $namespaces.name "default" }}    
apiVersion: v1
kind: Namespace
metadata:
  name: {{ $namespaces.name }}
  labels:
    name: {{ $namespaces.name }}
{{ if (not (has $namespaces.name (list "default" "ingress-controller" "rbac-manager" "velero"))) }}
    namespace: custom
{{ end }}
{{ end }}
{{ end }}

答案 1 :(得分:0)

您正在尝试将字符串作为第一个参数传递给without function,而该字符串需要一个列表。

这是一个有关如何使用without函数的示例。我从name数组中删除了多余的namespaces键。

values.yaml

namespaces:
  - default
  - ingress-controller
  - rbac-manager
  - velero
  - test1
  - test2
  - test3

namespace.yaml

{{ $compare := without .Values.namespaces list "default" "ingress-controller" "rbac-manager" "velero" }}
{{- range $namespace := .Values.namespaces }}
{{- if ne $namespace "default" }}    
apiVersion: v1
kind: Namespace
metadata:
  name: {{ $namespace }}
  labels:
    name: {{ $namespace }}
{{- if has $namespace $compare }}
    namespace: custom
{{- end }}
---
{{- end }}
{{- end }}

without函数返回 list 时,首先我们创建一个没有指定值的 list 。然后,我们遍历namespaces并检查$custom列表是否具有值。

答案 2 :(得分:0)

所以 sprig 文档有点缺乏,但我想说的是,您通常将列表作为第二个参数传递。 first 参数肯定是一个列表,但是您可以在 sprig unit tests for the list functions 中看到下一个参数肯定不是,而只是您要跳过的元素。如果您将该信息与 official docs 结合起来,您可以推断您传入了额外的参数以跳过数组中的其他元素。

例如

{{ without (list 1 2 3 4) 1 2 3 }}

会给 [4]

如果你真的想跳过整个列表的元素,那么你可以这样做:

{{ without (list (list 1 2 3) 4) (list 1 2 3) }}

这会给你 [4]