提供的一些声明和使用命名模板段的操作:

  1. define在模板中声明一个新的命名模板
  2. template导入一个命名模板
  3. block 声明了一种特殊的可填写模板区域

首先,模板名称是全局的。如果声明两个具有相同名称的模板,则最后加载一个模板是起作用的模板。由于子chart中的模板与顶级模板一起编译,因此注意小心地使用特定chart的名称来命名模板。

通用的命名方式是,以chart名称作为前缀,eg: {{ define "mychart.labels" }}

用define和template声明,使用模板

示例:

  1. {{/* Generate basic labels */}}
  2. {{- define "mychart.labels" }}
  3. labels:
  4. generator: helm
  5. date: {{ now | htmlDate }}
  6. {{- end }}
  7. apiVersion: v1
  8. kind: ConfigMap
  9. metadata:
  10. name: {{ .Release.Name }}-configmap
  11. {{- template "mychart.labels" }}
  12. data:
  13. myvalue: "Hello World"
  14. {{- range $key, $val := .Values.favorite }}
  15. {{ $key }}: {{ $val | quote }}
  16. {{- end }}

当模板引擎读取该文件时,它将存储引用mychart.labels直到template "mychart.labels"被调用。然后它将在文件内渲染该模板。结果:

  1. # Source: mychart/templates/configmap.yaml
  2. apiVersion: v1
  3. kind: ConfigMap
  4. metadata:
  5. name: running-panda-configmap
  6. labels:
  7. generator: helm
  8. date: 2016-11-02
  9. data:
  10. myvalue: "Hello World"
  11. drink: "coffee"
  12. food: "pizza"

按照惯例,define函数会有一个简单的文档块({{/* ... */}})来描述自己。  

Helm chart通常将这些模板放入partials文件中,通常是_helpers.tpl。 定义和引用的方式不变。

如果这样定义一个模板 

  1. {{/* Generate basic labels */}}
  2. {{- define "mychart.labels" }}
  3. labels:
  4. generator: helm
  5. version: {{ .Chart.Version }}
  6. {{- end }}

还是这样引用:

  1. {{- template "mychart.labels" }}

则 version 的值为空,因为模板需要一个上下文:

  1. {{- template "mychart.labels" . }}
  2. 把顶层对象'.'传递给模板,即可引用.Release,.Chaert 等。

include

这是一个引用模板的函数:

假设我们定义了一个这样的模板:

  1. {{- define "mychart.app" -}}
  2. app_name: {{ .Chart.Name }}
  3. app_version: "{{ .Chart.Version }}+{{ .Release.Time.Seconds }}"
  4. {{- end -}}

并且正常引用:

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: {{ .Release.Name }}-configmap
  5. labels:
  6. {{ template "mychart.app" .}}
  7. data:
  8. myvalue: "Hello World"
  9. {{- range $key, $val := .Values.favorite }}
  10. {{ $key }}: {{ $val | quote }}
  11. {{- end }}
  12. {{ template "mychart.app" . }}

结果会有缩进错误:

  1. # Source: mychart/templates/configmap.yaml
  2. apiVersion: v1
  3. kind: ConfigMap
  4. metadata:
  5. name: measly-whippet-configmap
  6. labels:
  7. app_name: mychart
  8. app_version: "0.1.0+1478129847" #缩进错误
  9. data:
  10. myvalue: "Hello World"
  11. drink: "coffee"
  12. food: "pizza"
  13. app_name: mychart
  14. app_version: "0.1.0+1478129847" #缩进错误

因为template的数据只是内嵌插入,是一个‘动作’,而非‘函数’,即不能通过管道传递给其他函数,来进行格式化。  

include 配合 indent 可以解决这个问题。

  1. {{ include "mychart.app" . | indent 4 }}
  2. 引用 mychart.app 且每一行缩进4字符

上面的示例可以改为

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: {{ .Release.Name }}-configmap
  5. labels:
  6. {{ include "mychart.app" . | indent 4 }}
  7. data:
  8. myvalue: "Hello World"
  9. {{- range $key, $val := .Values.favorite }}
  10. {{ $key }}: {{ $val | quote }}
  11. {{- end }}
  12. {{ include "mychart.app" . | indent 2 }}

文件访问

Helm通过.Files对象提供对文件的访问,例如Files.Get是一个按名称获取文件的函数(.Files.Get config.ini)。下面是几个要注意的点:

  1. Helm chart添加额外的文件是可以的。这些文件将被捆绑并发送给Tiller。不过要注意,由于Kubernetes对象的存储限制,chart必须小于1M
  2. 通常出于安全原因,某些文件不能通过.Files对象访问。
  3. templates/下的文件。
  4. 使用.helmignore排除的文件不能被访问。

示例:

首先创建三个文件

  1. config1.toml:
  2. message = Hello from config 1
  3. config2.toml:
  4. message = This is config 2
  5. config3.toml:
  6. message = Goodbye from config 3

然后,用一个range函数来遍历它们并将它们的内容注入到ConfigMap中。

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: {{ .Release.Name }}-configmap
  5. data:
  6. {{- $files := .Files }}
  7. {{- range tuple "config1.toml" "config2.toml" "config3.toml" }}
  8. {{ . }}: |-
  9. {{ $files.Get . }}
  10. {{- end }}

其结果如下:

  1. # Source: mychart/templates/configmap.yaml
  2. apiVersion: v1
  3. kind: ConfigMap
  4. metadata:
  5. name: quieting-giraf-configmap
  6. data:
  7. config1.toml: |-
  8. message = Hello from config 1
  9. config2.toml: |-
  10. message = This is config 2
  11. config3.toml: |-
  12. message = Goodbye from config 3

Glob 函数

Glob是一个可以一次获取多个文件的函数。

  1. 假设这样的一个目录结构:
  2. foo/:
  3. foo.txt
  4. foo.yaml
  5. bar/:
  6. bar.go
  7. bar.conf
  8. baz.yaml

则可以这样引用文件:

  1. {{ $root := . }}
  2. {{ range $path, $bytes := .Files.Glob "**.yaml" }}
  3. {{ $path }}: |-
  4. {{ $root.Files.Get $path }}
  5. {{ end }}

或者这样:

  1. {{ range $path, $bytes := .Files.Glob "foo/*" }}
  2. {{ $path.base }}: '{{ $root.Files.Get $path | b64enc }}' # b64enc 是base64编码函数。
  3. {{ end }}

有时候想要将文件内容放到configmap里,则可以用Glob ,ConfigMap和Secrets配合实现:

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: conf
  5. data:
  6. {{ (.Files.Glob "foo/*").AsConfig | indent 2 }}
  7. ---
  8. apiVersion: v1
  9. kind: Secret
  10. metadata:
  11. name: very-secret
  12. type: Opaque
  13. data:
  14. {{ (.Files.Glob "bar/*").AsSecrets | indent 2 }}

按行获取文件:

  1. data:
  2. some-file.txt: {{ range .Files.Lines "foo/bar.txt" }}
  3. {{ . }}{{ end }}

helm-chart5,模板和访问文件的更多相关文章

  1. vert.x学习(六),动态模板与静态文件的结合

    这篇学习在动态模板里面引入css,把动态模板与静态文件结合起来使用. 编写DynamicReference.java package com.javafm.vertx.helloworld; impo ...

  2. 我的django之旅(二)模板和静态文件

    我的django之旅(二)模板和静态文件 标签(空格分隔): django 1.为什么要使用模板 在上一篇博文中,提到了HttpReponse,但是HttpReponse只能传送字符串,如果要构建一个 ...

  3. Python第五天 文件访问 for循环访问文件 while循环访问文件 字符串的startswith函数和split函数 linecache模块

    Python第五天   文件访问    for循环访问文件    while循环访问文件   字符串的startswith函数和split函数  linecache模块 目录 Pycharm使用技巧( ...

  4. django模板和静态文件

    1.为什么要使用模板 在上一篇博文中,提到了HttpReponse,但是HttpReponse只能传送字符串,如果要构建一个网页,那么工作量就会十分巨大.模板是一种方便的标签,存在于HTML文件中,我 ...

  5. Yii2:避免文件路径暴漏,代理访问文件

    制作背景:公司要做第三方文件管理系统,客户有时候需要直接访问文件,但是我们又不想暴露文件路径,才有这代理访问 基本功能介绍:读取txt文档.读取图片,如果有需要,可以通过插件读取doc.pdf文档, ...

  6. 【解决】SQL Server作业中Excel Application不能访问文件

    在通过SQL Server作业来实现定时任务时,出现如下错误: FullyQualifiedErrorId : ComMethodTargetInvocation使用“1”个参数调用“Add”时发生异 ...

  7. UNIX索引技术访问文件初阶

    背景: 软考里面,多次碰到一道题: 过程 以前对于这样的题,仅仅知道: 在文件系统中,文件的存储设备通常划分为若干个大小相等的物理块,每块长为512或1024字节.文件的理结构是指文件在存储设备上的存 ...

  8. Microsoft Office Excel 不能访问文件及COM无法访问

    Microsoft Office Excel 不能访问文件及COM无法访问 Microsoft Office Excel 不能访问文件“*.xls”. 可能的原因有: 1 文件名称或路径不存在. 2  ...

  9. 防止apache下面直接输入目录访问文件

    有些项目链接会暴露服务器上面的文件地址,如何访问文件被访问呢 方法一: 在项目入口文件下面新加一个.htaccess文件(apache开启重写模式才会加载这个文件,否则这个文件配置不会生效) 文件中加 ...

随机推荐

  1. Kubenetes 资源清单定义入门

    Kubernetes 常用资源 资源  对象 工作负载型资源对象(workload): Pod  Replicaset  ReplicationController  Deployments Stat ...

  2. Hbase 元数据一致性检查(转)

    最近在学习HBase先关的知识,顺便做一下笔记,以加深知识的了解和掌握. Hbase常用工具 文件检测修复工具 hbase hbck -help 常用选项: -details 显示所有region检查 ...

  3. 类型和原生函数及类型转换(三:终结js类型转换)

    Number() parseInt() parseFloat() Boolean() String() toString() 一.显式类型转换 -------Number()函数把对象的值转换为数字. ...

  4. ACM-ICPC 2018 徐州赛区网络预赛 J Maze Designer(最大生成树+LCA)

    https://nanti.jisuanke.com/t/31462 题意 一个N*M的矩形,每个格点到其邻近点的边有其权值,需要构建出一个迷宫,使得构建迷宫的边权之和最小,之后Q次查询,每次给出两点 ...

  5. Spring Security 之API 项目安全验证(基于basic-authentication)

    ===================================Basic Authorization 规范===================================Request ...

  6. [物理学与PDEs]第2章习题11 Lagrange 形式的一维理想流体力学方程组在强间断线上的间断连接条件

    对由第 10 题给出的 Lagrange 形式的一维理想流体力学方程组, 给出解在强间断线上应满足的间断连接条件 (假设体积力 $F\equiv 0$). 解答: $$\beex \bea \sez{ ...

  7. sqlmap基础入门超详细教程

    前言: 总算进入了自己喜欢的行业. 要时刻记得当初自己说过的话, 不忘初心. Come on! 资料: 感谢超哥分享的干货..  sqlmap干货点击直达 学习环境: 本次学习使用的是kali集成的s ...

  8. volative 与处理器的嗅探技术

    在<java并发编程的艺术>这本书中,关于volatile的内存原理本质的描述如下: 有volatile变量修饰共享变量在编译器编译后,后多出一个“lock” 来(lock前缀指令相当于一 ...

  9. C#基于任务的异步模式

    using System; using System.Threading; using System.Threading.Tasks; using static System.Console; //异 ...

  10. H - Partial Tree HDU - 5534 (背包)

    题目链接: H - Partial Tree  HDU - 5534 题目大意:首先是T组测试样例,然后n个点,然后给你度数分别为(1~n-1)对应的不同的权值,然后问你在这些点形成树的前提下的所能形 ...