我正在使用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 }}
答案 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]
。