• helm-chart5,模板和访问文件


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

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

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

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

    用define和template声明,使用模板

    示例:

    {{/* Generate basic labels */}}
    {{- define "mychart.labels" }}
      labels:
        generator: helm
        date: {{ now | htmlDate }}
    {{- end }}
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: {{ .Release.Name }}-configmap
      {{- template "mychart.labels" }}
    data:
      myvalue: "Hello World"
      {{- range $key, $val := .Values.favorite }}
      {{ $key }}: {{ $val | quote }}
      {{- end }}
    

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

    # Source: mychart/templates/configmap.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: running-panda-configmap
      labels:
        generator: helm
        date: 2016-11-02
    data:
      myvalue: "Hello World"
      drink: "coffee"
      food: "pizza"
    

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

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

    如果这样定义一个模板 

    {{/* Generate basic labels */}}
    {{- define "mychart.labels" }}
      labels:
        generator: helm
        version: {{ .Chart.Version }}
    {{- end }}
    

    还是这样引用:

    {{- template "mychart.labels" }}
    

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

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

    include

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

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

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

    并且正常引用:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: {{ .Release.Name }}-configmap
      labels:
        {{ template "mychart.app" .}}
    data:
      myvalue: "Hello World"
      {{- range $key, $val := .Values.favorite }}
      {{ $key }}: {{ $val | quote }}
      {{- end }}
    {{ template "mychart.app" . }}
    

    结果会有缩进错误:

    # Source: mychart/templates/configmap.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: measly-whippet-configmap
      labels:
        app_name: mychart
    app_version: "0.1.0+1478129847" #缩进错误
    data:
      myvalue: "Hello World"
      drink: "coffee"
      food: "pizza"
      app_name: mychart
    app_version: "0.1.0+1478129847" #缩进错误
    

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

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

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

    上面的示例可以改为

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: {{ .Release.Name }}-configmap
      labels:
    {{ include "mychart.app" . | indent 4 }}
    data:
      myvalue: "Hello World"
      {{- range $key, $val := .Values.favorite }}
      {{ $key }}: {{ $val | quote }}
      {{- end }}
    {{ include "mychart.app" . | indent 2 }}
    

    文件访问

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

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

    示例:

    首先创建三个文件

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

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

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: {{ .Release.Name }}-configmap
    data:
      {{- $files := .Files }}
      {{- range tuple "config1.toml" "config2.toml" "config3.toml" }}
      {{ . }}: |-
        {{ $files.Get . }}
      {{- end }}
    

    其结果如下:

    # Source: mychart/templates/configmap.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: quieting-giraf-configmap
    data:
      config1.toml: |-
        message = Hello from config 1
    
      config2.toml: |-
        message = This is config 2
    
      config3.toml: |-
        message = Goodbye from config 3
    

    Glob 函数

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

    假设这样的一个目录结构:
    foo/:
      foo.txt 
      foo.yaml
    
    bar/:
      bar.go 
      bar.conf 
      baz.yaml
    

    则可以这样引用文件:

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

    或者这样:

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

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

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: conf
    data:
    {{ (.Files.Glob "foo/*").AsConfig | indent 2 }}
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: very-secret
    type: Opaque
    data:
    {{ (.Files.Glob "bar/*").AsSecrets | indent 2 }}
    

    按行获取文件:

    data:
      some-file.txt: {{ range .Files.Lines "foo/bar.txt" }}
        {{ . }}{{ end }}
  • 相关阅读:
    改变文件属性和权限
    Linux文件属性
    Linux 学习笔记
    一些常见的第三方UI库
    list转化为json数组
    在js文件里调用另一个js文件里的函数
    Intellij idea创建maven项目并配置tomcat
    使用JS语句,利用for循环的方法创建表格的两种方法
    intellij idea 破解教程
    Jquery中的DOM操作:
  • 原文地址:https://www.cnblogs.com/mingbai/p/chart5.html
Copyright © 2020-2023  润新知