函数与管道

函数与管道

函数

Helm 拥有超过 60 种可用函数。其中一些是由 Go 模板语言 Go template language 本身定义的。其他大多数都是 Sprig 模板库 Sprig template library 的一部分。当从. Values 对象注入字符串到模板中时,我们引用这些字符串。我们可以通过调用 quote 模板指令中的函数来实现:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{.Release.Name}}-configmap
data:
  myvalue: "Hello World"
  drink: {{quote .Values.favorite.drink}}
  food: {{quote .Values.favorite.food}}

模板函数遵循语法 functionName arg1 arg2...。在上面的代码片段中,quote .Values.favorite.drink 调用 quote 函数并将一个参数传递给它。

default 函数

经常使用的一个函数是 defaultdefault DEFAULT_VALUE GIVEN_VALUE。该功能允许在模板内部指定默认值,以防该值被省略。让我们用它来修改上面的饮料示例:

drink: { { .Values.favorite.drink | default "tea" | quote } }

如果我们像往常一样运行,我们会得到我们的 coffee:

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: virtuous-mink-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "PIZZA"

现在,我们将从以下位置删除喜欢的饮料设置 values.yaml:

favorite:
  #drink: coffee
  food: pizza

现在重新运行 helm install --dry-run --debug ./mychart 会产生这个 YAML:

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: fair-worm-configmap
data:
  myvalue: "Hello World"
  drink: "tea"
  food: "PIZZA"

在实际的 chart 中,所有静态默认值应该存在于 values.yaml 中,不应该使用该 default 命令重复(否则它们将是重复多余的)。但是,default 命令对于计算的值是合适的,因为计算值不能在 values.yaml 中声明。例如:

drink:
  {
    {
      .Values.favorite.drink | default (printf "%s-tea" (include "fullname" .)),
    },
  }

在一些地方,一个 if 条件可能比这 default 更适合。我们将在下一节中看到这些。模板函数和管道是转换信息并将其插入到 YAML 中的强大方法。但有时候需要添加一些比插入字符串更复杂一些的模板逻辑。在下一节中,我们将看看模板语言提供的控制结构。

运算符函数

对于模板,运算符(eq,ne,lt,gt,and,or 等等)都是已实现的功能。在管道中,运算符可以用圆括号(())分组。

将运算符放到声明的前面,后面跟着它的参数,就像使用函数一样。要多个运算符一起使用,将每个函数通过圆括号分隔。

{{/* include the body of this if statement when the variable .Values.fooString xists and is set to "foo" */}}
{{if and .Values.fooString (eq .Values.fooString "foo") }}
    {{...}}
{{end}}


{{/* do not include the body of this if statement because unset variables evaluate o false and .Values.setVariable was negated with the not function. */}}
{{if or .Values.anUnsetVariable (not .Values.aSetVariable) }}
   {{...}}
{{end}}

现在我们可以从函数和管道转向流控制,条件,循环和范围修饰符。

管道

模板语言的强大功能之一是其管道概念。利用 UNIX 的一个概念,管道是一个链接在一起的一系列模板命令的工具,以紧凑地表达一系列转换。换句话说,管道是按顺序完成几件事情的有效方式。我们用管道重写上面的例子。

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{.Release.Name}}-configmap
data:
  myvalue: "Hello World"
  drink: {{.Values.favorite.drink | quote}}
  food: {{.Values.favorite.food | quote}}

在这个例子中,没有调用 quote ARGUMENT,我们调换了顺序。我们使用管道(|)将 “参数” 发送给函数:.Values.favorite.drink | quote。使用管道,我们可以将几个功能链接在一起:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{.Release.Name}}-configmap
data:
  myvalue: "Hello World"
  drink: {{.Values.favorite.drink | quote}}
  food: {{.Values.favorite.food | upper | quote}}

当模板执行时,该模板将产生如下结果:

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: trendsetting-p-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "PIZZA"

请注意,我们的原来 pizza 现在已经转换为 "PIZZA"

当有像这样管道参数时,第一个评估(.Values.favorite.drink)的结果将作为函数的最后一个参数发送。我们可以修改上面的饮料示例来说明一个带有两个参数的函数 repeat COUNT STRING

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{.Release.Name}}-configmap
data:
  myvalue: "Hello World"
  drink: {{.Values.favorite.drink | repeat 5 | quote}}
  food: {{.Values.favorite.food | upper | quote}}

该 repeat 函数将回送给定的字符串和给定的次数,所以我们将得到这个输出:

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: melting-porcup-configmap
data:
  myvalue: "Hello World"
  drink: "coffeecoffeecoffeecoffeecoffee"
  food: "PIZZA"
上一页
下一页