前面我们学习了 Helm 模板中的⼀些常用方法,但都是操作的⼀个模板文件,在实际的应用中,很多都是相对比较复杂的,往往会超过⼀个模板,如果有多个应用模板,我们应该如何进行处理呢?这就需要用到新的概念:命名模板。

命名模板我们也可以称为子模板,是限定在⼀个文件内部的模板,然后给⼀个名称。在使用命名模板的时候有⼀个需要特别注意的是:模板名称是全局的,如果我们声明了两个相同名称的模板,最后加载的⼀个模板会覆盖掉另外的模板,由于子 chart 中的模板也是和顶层的模板⼀起编译的,所以在命名的时候⼀定要注意,不能重名了。为了避免重名,有个通用的约定就是为每个定义的模板添加上 chart 名称: {{define”mychart.labels”}} , define 关键字就是用来声明命名模板的,加上 chart 名称就可以避免不同chart 间的模板出现冲突的情况。

1、声明和使用命名模板

使用 define 关键字就可以允许我们在模板文件内部创建⼀个命名模板,它的语法格式如下:

{{ define "ChartName.TplName" }}
# 模板内容区域
{{ end }}

比如,现在我们可以定义⼀个模板来封装⼀个 label 标签:

{{- define "mychart.labels" }}labels:from: helmdate: {{ now | htmlDate }}
{{- end }}

然后我们可以将该模板嵌⼊到现有的 ConfigMap 中,然后使⽤ template 关键字在需要的地⽅包含进来即可:

上面这个模板⽂件被渲染过后的结果如下所示:

我们可以看到 define 区域定义的命名模板被嵌入到了 template 所在的区域,但是如果我们将命名模板全都写入到⼀个模板文件中的话无疑会增大模板的复杂性。还记得我们在创建 chart 包的时候,templates 目录下⾯默认会生成⼀个 _helpers.tpl 文件吗?我们前面也提到过 templates 目录下⾯除了 NOTES.txt 文件和以下划线 _ 开头命令的文件之外,都会被当做 kubernetes 的资源清单文件,而这个下划线开头的文件不会被当做资源清单外,还可以被其他chart 模板中调用,这个就是 Helm 中的 partials 文件,所以其实我们完全就可以将命名模板定义在这些 partials 文件中,默认就是 _helpers.tpl 文件了。

现在我们将上⾯定义的命名模板移动到 templates/_helpers.tpl 文件中去:

{{/* 生成基本的 labels 标签 */}}
{{- define "mychart.labels" }}labels:from: helmdate: {{ now | htmlDate }}
{{- end }}

⼀般情况下⾯,我们都会在命名模板头部加⼀个简单的文档块,⽤ /**/ 包裹起来,用来描述命名模板的用途。现在我们将命名模板从模板文件 templates/configmap.yaml 中移除,当然还是需要保留 template 来嵌入命名模板内容,名称还是之前的 mychart.lables,这是因为模板名称是全局的,所以我们可以直接获取到。我们再用 DEBUG 模式来调试下是否符合预期:

2、模板范围

上面我们定义的命名模板中,没有使用任何对象,只是使用了⼀个简单的函数,如果我们在里面加入 chart 对象相关信息呢 templates/_helpers.tpl :

{{/* 生成基本的 labels 标签 */}}
{{- define "mychart.labels" }}labels:from: helmdate: {{ now | htmlDate }}chart: {{ .Chart.Name }}version: {{ .Chart.Version }}
{{- end }}

如果这样的直接进行渲染测试的话,不会得到我们预期的结果:

chart 的名称和版本都没有正确被渲染,这是因为他们不在我们定义的模板范围内,当命名模板被渲染时,它会接收由 template 调用时传⼊的作用域,有我们我们这里并没有传⼊对应的作用域,因此模板中我们⽆法调用到 .Chart 对象,要解决也非常简单,我们只需要在 template 后面加上作用域范围即可:

我们在 template 末尾传递了 . ,表示当前的最顶层的作用范围,如果我们想要在命名模板中使用 .Values 范围内的数据,当然也是可以的,现在我们再来渲染下模板:

我们可以看到 chart 的名称和版本号都已经被正常渲染出来了。

3、include函数

假如现在我们将上面定义的 labels 单独提取出来放置到 _helpers.tpl 文件中;然后我们将该命名模板插入到 configmap 模板文件的 labels 部分和 data 部分:

然后同样的查看下渲染的结果:

我们可以看到渲染结果是有问题的,不是⼀个正常的 YAML 文件格式。app_version在两个位置上的缩进都是错误的。为什么?因为替换的模板的文本右对齐。template 只是表示⼀个嵌入动作而已,不是⼀个函数,所以原本命名模板中是怎样的格式就是怎样的格式被嵌入进来了,那如果我们在命名模板中给内容区域都空了两个空格,会渲染出什么呢?有兴趣的小伙伴可以自己尝试debug一下看看哦。

操作之后你可以看到 data 区域里面的内容是渲染正确的,但是上⾯ labels 区域是不正常的,因为命名模板里⾯的内容是属于 labels 标签的,是不符合预期的,但是我们又不可能再去把命名模板里面的内容再增加两个空格,因为这样的话 data 里面的格式又不符合预期了。为了解决这个问题,Helm 提供了另外⼀个⽅案来代替 template ,那就是使⽤ include 函数,在需要控制空格的地⽅使⽤ indent 管道函数来⾃⼰控制,比如上⾯的例⼦我们替换成 include 函数:

在 labels 区域我们需要4个空格,所以在管道函数 indent 中,传入参数4就可以,而在 data 区域我们只需要2个空格,所以我们传入参数2即可以,现在我们来渲染下我们这个模板看看是否符合预期呢:

可以看到是符合我们的预期,所以在 Helm 模板中我们使⽤ include 函数要比 template 更好,可以更好地处理 YAML ⽂件输出格式。

Helm3模板-命名模板相关推荐

  1. drupal7模板命名机制/规则

    drupal7模板命名机制/规则 今天讲的是困扰我w3123.com几天的问题了,就是drupal7模板命名机制/规则. 从WordPress转战drupal快两个星期了,就drupal的默认主题来说 ...

  2. 问模板函数、函数模板,模板类、类模板的区别的问题?

    问模板函数.函数模板,模板类.类模板的区别的问题? - 赵保龙 - 博客园 问模板函数.函数模板,模板类.类模板的区别的问题? 在C++中有好几个这样的术语,但是我们很多时候用的并不正确,几乎是互相替 ...

  3. 模板类与类模板、函数模板与模板函数等的区别

    在C++中有好几个这样的术语,但是我们很多时候用的并不正确,几乎是互相替换混淆使用.下面我想彻底辨清几个术语,这样就可以避免很多概念上的混淆和使用上的错误. 这几个词是: 函数指针--指针函数 数组指 ...

  4. html模板继承,模板继承

    Jinja 中最强大的部分就是模板继承.模板继承允许你构建一个包含你站点共同元素的基 本模板"骨架",并定义子模板可以覆盖的 块 . 听起来复杂,实际上很简单.从例子上手是最易于理 ...

  5. 模板函数与函数模板 类模板和模板的说明

    一,模板的概念. 引入模板的原因: 我们已经学过重载,对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同.正确的调用重载函数.例如,为求两个数的最大值,我们定义MAX()函数需要对不同 ...

  6. C++知识点59——类模板(4、类模板的模板参数是一个类模板)

    接上一篇文章https://blog.csdn.net/Master_Cui/article/details/111824152 七.类模板的模板参数是一个模板类 类模板的模板参数本身可以是一个类模板 ...

  7. 记录一下HALCON基于可变形,利用CAD画dxf模板进行模板匹配(二)

    本文接着上一篇记录一下HALCON基于可变形,利用CAD画dxf模板进行模板匹配 打开HALCON并打开匹配助手 匹配助手如图 "创建"页说明: 1,选择匹配方式 中间偏上方的下拉 ...

  8. Xamarin XAML语言教程控件模板的模板绑定

    Xamarin XAML语言教程控件模板的模板绑定 控件模板的模板绑定 为了可以轻松更改控件模板中控件上的属性值,可以在控件模板中实现模板绑定功能.模板绑定允许控件模板中的控件将数据绑定到公共属性上. ...

  9. 【C++ 语言】面向对象 ( 模板编程 | 函数模板 | 类模板 )

    文章目录 函数模板 类模板 代码示例 函数模板 1. 模板编程 : 类似于 Java 中的泛型编程 ; ① 函数模板 : 对应着 Java 中的泛型方法 ; ② 类模板 : 对应 Java 中的泛型类 ...

最新文章

  1. hadoop学习--多表关联
  2. ABAP 新建session会话的函数
  3. numberformatexception是什么异常_译文《最常见的10种Java异常问题》
  4. OSChina 娱乐弹弹弹——Team,对你爱爱爱不完
  5. Ubuntu 16.04+.Net Core+Docker+Nginx安装部署
  6. 获取异常信息_如何在 ASP.NET Core 中实现全局异常拦截
  7. ActiveRecord模式整理
  8. html5实现无缝滚动的效果,基于JavaScript实现无缝滚动效果
  9. svchost.exe占用CPU 100%,也可能是这样的原因
  10. C#如何与OPC连接
  11. Trick(四)——翻转字符串的实现
  12. eclipse 远程调试mapreduce
  13. python第四周作业_马哥2016全新Linux+Python高端运维班第四周作业
  14. 从Oracle Database 角度来看浪潮天梭K1主机的操作系统选择
  15. 多项logistic回归系数解释_逻辑回归logistic(含python代码)
  16. spring的配置及依赖注入(详细)
  17. Python实现BT种子转化为磁力链接
  18. LODOP 打印图片和表格
  19. PHP工程改成微擎的步骤_微擎系统搭建
  20. 微信小程序 会议室课堂考勤签到助手 源码

热门文章

  1. Xen network Linux
  2. websocket 前后端交互实战
  3. appium报错Killing adb server on port 5037问题,及pycharm连接不到Android设备问题
  4. 常用分析方法——矩阵关联分析
  5. invidia-smi报错Failed to initialize NVML: Driver/library version mismatch的根本原因
  6. vue常用开发ui框架(app,后台管理系统,移动端)及插件
  7. 听说了吗?今年中秋我们打算搞个大事!
  8. 微信小程序个人中心-我的界面
  9. MongoDB操作-备份和恢复
  10. web大屏智慧旅游景区可视化源码大数据管理模板案例