模板的函数和pipeline

    让我们从一个最佳实践开始:当从.Values对象注入字符串到模板中时,我们应该引用这些字符串。 我们可以通过在模板指令中调用quote函数来实现:

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

    Helm拥有超过60种可用功能。 其中一些是由Go模板语言本身定义的。 其他大多数都是的一部分。 在我们通过例子进行的过程中,我们会看到其中的很多。

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

    1. kind: ConfigMap
    2. metadata:
    3. name: {{ .Release.Name }}-configmap
    4. data:
    5. myvalue: "Hello World"
    6. drink: {{ .Values.favorite.drink | quote }}
    7. food: {{ .Values.favorite.food | quote }}

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

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: {{ .Release.Name }}-configmap
    5. myvalue: "Hello World"
    6. drink: {{ .Values.favorite.drink | quote }}

    评估时,该模板将产生以下结果:

    请注意,我们原来的“pizza”现在已经变成了“PIZZA”。

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

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

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

    1. # Source: mychart/templates/configmap.yaml
    2. apiVersion: v1
    3. kind: ConfigMap
    4. metadata:
    5. data:
    6. drink: "coffeecoffeecoffeecoffeecoffee"
    7. food: "PIZZA"

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

    如果我们照常运行,我们会得到我们的coffee:

    1. # Source: mychart/templates/configmap.yaml
    2. apiVersion: v1
    3. kind: ConfigMap
    4. metadata:
    5. name: virtuous-mink-configmap
    6. data:
    7. myvalue: "Hello World"
    8. drink: "coffee"
    9. food: "PIZZA"
    1. favorite:
    2. #drink: coffee

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

    在实际的chart中,所有静态默认值都应该存在于values.yaml中,并且不应该使用default命令重复(否则它们将是多余的)。 但是,default命令无法在values.yaml中声明的计算是非常有用的。 例如:

    在某些地方,有if条件的使用default比在values.yaml声明更适合. 我们将在下一节中看到这些。

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

    对于模板,运算符(eq,ne,lt,gt等等)都是作为函数实现的。 在管道中,操作可以用括号((和))分组。

    现在我们可以使用条件,循环和范围修饰符从函数和pipeline转向流控制(flow control)。