文章目录

  • 1. 模板函数
  • 2. 辅助模板
  • 2. 管道
  • 3. default 函数
  • 4. lookup 函数
  • 5. 运算符

1. 模板函数

比如我们需要从.Values中读取的值变成字符串的时候就可以通过调用quote模板函数来实现:(templates/configmap.yaml)

apiVersion: v1
kind: ConfigMap
metadata:name: {{ .Release.Name }}-configmap
data:myvalue: "Hello World"k8s: {{ quote .Values.course.k8s }}python: {{ .Values.course.python }}

模板函数遵循调用的语法为:functionName arg1 arg2...。在上面的模板文件中,quote .Values.course.k8s调用quote函数并将后面的值作为一个参数传递给它。最终被渲染为:

$ helm install --dry-run --debug .
[debug] Created tunnel using local port: '39405'
......
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: masked-saola-configmap
data:myvalue: "Hello World"k8s: "devops"python: django

我们可以看到.Values.course.k8s被渲染成了字符串devops。上节课我们也提到过 Helm 是一种 Go 模板语言,拥有超过60多种可用的内置函数,一部分是由Go 模板语言本身定义的,其他大部分都是Sprig模板库提供的一部分,我们可以前往这两个文档中查看这些函数的用法。

比如我们这里使用的quote函数就是Sprig 模板库提供的一种字符串函数,用途就是用双引号将字符串括起来,如果需要双引号",则需要添加\来进行转义,而squote函数的用途则是用双引号将字符串括起来,而不会对内容进行转义。

所以在我们遇到一些需求的时候,首先要想到的是去查看下上面的两个模板文档中是否提供了对应的模板函数,这些模板函数可以很好的解决我们的需求。

2. 辅助模板

有时您想在图表中创建一些可重复使用的部分,无论它们是块还是模板部分。通常,将它们保存在自己的文件中会更干净。

在该templates/目录中,任何以下划线 ( _) 开头的文件都不会输出 Kubernetes 清单文件。所以按照惯例,辅助模板和部分被放置在一个_helpers.tpl文件中。

2. 管道

模板语言除了提供了丰富的内置函数之外,其另一个强大的功能就是管道的概念。和UNIX中一样,管道我们通常称为Pipeline,是一个链在一起的一系列模板命令的工具,以紧凑地表达一系列转换。简单来说,管道是可以按顺序完成一系列事情的一种方法。比如我们用管道来重写上面的 ConfigMap 模板:(templates/configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:name: {{ .Release.Name }}-configmap
data:myvalue: "Hello World"k8s: {{ .Values.course.k8s | quote }}python: {{ .Values.course.python }}

这里我们直接调用quote函数,而是调换了一个顺序,使用一个管道符|将前面的参数发送给后面的模板函数:{{ .Values.course.k8s | quote }},使用管道我们可以将几个功能顺序的连接在一起,比如我们希望上面的 ConfigMap 模板中的 k8s 的 value 值被渲染后是大写的字符串,则我们就可以使用管道来修改:(templates/configmap.yaml)

apiVersion: v1
kind: ConfigMap
metadata:name: {{ .Release.Name }}-configmap
data:myvalue: "Hello World"k8s: {{ .Values.course.k8s | upper | quote }}python: {{ .Values.course.python }}

这里我们在管道中增加了一个upper函数,该函数同样是Sprig 模板库提供的,表示将字符串每一个字母都变成大写。然后我们用debug模式来查看下上面的模板最终会被渲染成什么样子:

$ helm install --dry-run --debug .
[debug] Created tunnel using local port: '46651'
......
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: maudlin-labradoodle-configmap
data:myvalue: "Hello World"k8s: "DEVOPS"python: django

我们可以看到之前我们的devops已经被渲染成了"DEVOPS"了,要注意的是使用管道操作的时候,前面的操作结果会作为参数传递给后面的模板函数,比如我们这里希望将上面模板中的 python 的值渲染为重复出现3次的字符串,则我们就可以使用到Sprig 模板库提供的repeat函数,不过该函数需要传入一个参数repeat COUNT STRING表示重复的次数:(templates/configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:name: {{ .Release.Name }}-configmap
data:myvalue: "Hello World"k8s: {{ .Values.course.k8s | upper | quote }}python: {{ .Values.course.python | quote | repeat 3 }}

该repeat函数会将给定的字符串重复3次返回,所以我们将得到这个输出:

helm install --dry-run --debug .
[debug] Created tunnel using local port: '39712'......Error: YAML parse error on mychart/templates/configmap.yaml: error converting YAML to JSON: yaml: line 7: did not find expected key---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: piquant-butterfly-configmap
data:myvalue: "Hello World"k8s: "DEVOPS"python: "django""django""django"

我们可以看到上面的输出中 python 对应的值变成了3个相同的字符串,这显然是不符合我们预期的,我们的预期是形成一个字符串,而现在是3个字符串了,而且上面还有错误信息,根据管道处理的顺序,我们将quote函数放到repeat函数后面去是不是就可以解决这个问题了:(templates/configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:name: {{ .Release.Name }}-configmap
data:myvalue: "Hello World"k8s: {{ .Values.course.k8s | upper | quote }}python: {{ .Values.course.python | repeat 3 | quote }}

现在是不是就是先重复3次.Values.course.python的值,然后调用quote函数:

helm install --dry-run --debug .
[debug] Created tunnel using local port: '33837'......---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: braided-manatee-configmap
data:myvalue: "Hello World"k8s: "DEVOPS"python: "djangodjangodjango"

现在是不是就正常了,也得到了我们的预期结果,所以我们在使用管道操作的时候一定要注意是按照从前到后一步一步顺序处理的。

3. default 函数

另外一个我们会经常使用的一个函数是default 函数:default DEFAULT_VALUE GIVEN_VALUE。该函数允许我们在模板内部指定默认值,以防止该值被忽略掉了。比如我们来修改上面的 ConfigMap 的模板:(templates/configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:name: {{ .Release.Name }}-configmap
data:myvalue: {{ .Values.hello | default  "Hello World" | quote }}k8s: {{ .Values.course.k8s | upper | quote }}python: {{ .Values.course.python | repeat 5 | quote }}

由于我们的values.yaml文件中只定义了 course 结构的信息,并没有定义 hello 的值,所以如果没有设置默认值的话是得不到{{ .Values.hello }}的值的,这里我们为该值定义了一个默认值:Hello World,所以现在如果在values.yaml文件中没有定义这个值,则我们也可以得到默认值:

$ helm install --dry-run --debug .
[debug] Created tunnel using local port: '42670'......---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: orbiting-hog-configmap
data:myvalue: "Hello World"k8s: "DEVOPS"python: "djangodjangodjangodjangodjango"

我们可以看到myvalue值被渲染成了Hello World,证明我们的默认值生效了。

4. lookup 函数

该lookup函数可用于查找正在运行的集群中的资源。查找函数的概要是lookup apiVersion, kind, namespace, name -> resource or resource list

parameter apiVersion kind namespace name
type string string string string

name和都是namespace可选的,可以作为空字符串 ( "") 传递。

以下参数组合是可能的:

行为 查找功能
Kubectl Get Pod Mypod -N Mynamespace Lookup “v1” “Pod” “mynamespace” “mypod”
Kubectl Get Pods -N Mynamespace Lookup “v1” “Pod” “mynamespace” “”
Kubectl Get Pods —all-Namespaces Lookup “v1” “Pod” “” “”
Kubectl Get Namespace Mynamespace Lookup “v1” “Namespace” “” “mynamespace”
Kubectl Get Namespaces Lookup “v1” “Namespace” “” “”

lookup返回一个对象时,它会返回一个字典。可以进一步导航此字典以提取特定值。

以下示例将返回mynamespace对象的注释:

(lookup "v1" "Namespace" "" "mynamespace").metadata.annotations

返回对象列表时lookup,可以通过以下items字段访问对象列表:

{{ range $index, $service := (lookup "v1" "Service" "mynamespace" "").items }}{{/* do something with each service */}}
{{ end }}

当没有找到对象时,返回一个空值。这可用于检查对象是否存在。

lookup函数使用 Helm 现有的 Kubernetes 连接配置来查询 Kubernetes。如果与调用 API 服务器交互时返回任何错误(例如由于缺少访问资源的权限),则 helm 的模板处理将失败。

请记住,Helm 不应该在 a helm template或 a期间联系 Kubernetes API 服务器helm install|update|delete|rollback --dry-run,因此lookup在这种情况下,该函数将返回一个空列表(即 dict)。

5. 运算符

对于模板,运算符(eq、ne、lt、gt、and等or)都实现为函数。在管道中,操作可以用括号((和))分组。
现在我们可以从函数和管道转向带有条件、循环和范围修饰符的流控制。

Helm 模板函数与管道相关推荐

  1. Helm模板常用语法介绍与简单应用场景

    Helm模板常用语法介绍与简单应用场景 文章目录 Helm模板常用语法介绍与简单应用场景 什么是Helm _help.tpl子模版 应用场景 预定义对象 关于变量 关键字及应用 函数 流程与控制 什么 ...

  2. 【C++】模板函数的声明和定义必须在同一个文件中

    1.问题描述 习惯性的将函数的定义和实现,分别写在头文件和源文件(.cpp)中.今天也按照这个习惯实现了一个模板函数.然后编译时报错 ... error: undefined reference to ...

  3. [转]C++函数模板与模板函数

    1.函数模板的声明和模板函数的生成 1.1函数模板的声明 函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计.它的最大特点是把函数使用的数据类型作为参数. 函数模板 ...

  4. beego 显示html文件,[Beego] 内置的模板函数(不同格式的字符串和html的互转)

    在使用beego框架的时候,常常需要把不同形式的字符串转化为html,有时候为了安全考虑会将html转义,而有时候希望能显示html标签.在存储到db中后,再取出来的显示是原本的,即html标签不会生 ...

  5. 泛函编程—模板函数_类模板

    函数业务逻辑一样,只是函数参数类型不同 函数模板的本质:类型参数化--泛型编程 语法: template <typename T> template <class T1,class ...

  6. ytu 1057: 输入两个整数,求他们相除的余数(带参的宏 + 模板函数 练习)

    1057: 输入两个整数,求他们相除的余数 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 177  Solved: 136 [Submit][Stat ...

  7. 8-1日复习 模板函数 模板类

    函数的重载: //函数重载 感觉还是太繁琐 引入函数模板的概念#include <iostream>using namespace std;int add(int x , int y) { ...

  8. 模板类可以使用虚函数,模板函数不能是虚函数

    1.普通的类中怎么使用虚函数,模板类中也可以这么使用虚函数 不过需要注意的是使用模板类定义不同的类型则是两个完全不同的类. 2.模板函数不能是虚函数 编译器期望在处理类定义的时候就能确定虚函数表的大小 ...

  9. extern 定义_Essential Cython - 2.7 - 定义并使用模板函数

    项目地址: https://github.com/tushushu/EssentialCython​github.com 参考书籍: <Essential C++ 中文版> 编程环境: M ...

最新文章

  1. python3.7.2教程-centos7系统下python2与python3共存
  2. spring18-2:采用cglib字节码实现代理
  3. java map集合遍历方法,Java的Map集合的三种遍历方法
  4. Apache与Nginx比较(Nginx 高并发情况常用,必须学习)
  5. .NET MVC访问某方法后会跳转页面
  6. 九、多表模型创建,一对一,一对多,基于对像的多表模型等
  7. TFS中的统一集成(九)
  8. php设计模式之桥接模式
  9. ROS 内外网做双网卡绑定负载分流教程bonding 配置教程
  10. 有限状态机FSM的写法
  11. 卡巴斯基破解版 KISV8.0.0.432 Beta 江南混混汉化特别版
  12. Promise的九大方法(resolve、reject、then、catch、finally、all、allSettled、race、any)你都用过那些?
  13. 错误记录:FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecate
  14. 宁德时代与戴姆勒卡车股份公司扩大全球合作伙伴关系
  15. 用户IP访问次数统计
  16. 笔记本电脑没有wifi图标无法连接无线
  17. 关于机器学习的知识点,全在这篇文章里了
  18. 【经验】迅雨田下载测试
  19. SPH算法简介(一): 数学基础
  20. zabbix web 检测

热门文章

  1. 区块链大咖谈之蔡维德:法律的自动执行将颠覆法学研究、法律制度和法律实践...
  2. 制作网页版简易计算器(Calculator)
  3. 一位码农的人生自述(二十七)------羽毛球协会
  4. vue2 实现卡片模板编辑
  5. 4G模块 EC20 R2.0 USB Serial/GobiNet/QMI WWAN 驱动移植过程
  6. 【IT简史】ATT(贝尔电话公司)
  7. Twitter:难吃的薯条让我们看到大数据未来
  8. 高跟鞋为每一位女性的武器,以便能够选择
  9. 大众CEO:电动汽车前景非常好 下半年交付将加速
  10. Power Designer:如何在输入name的时候,让code不跟着变