Helm Chart Include Template
In this tutorial, we will discuss the helm chart include template using the include keyword.
In the earlier tutorial, we discussed how to include a template within another template. Also, I mentioned about two ways of including the template.
One is using the keyword template, another one using include. In the earlier example, we saw using the keyword template. While discussing that, I mentioned an important point: the alignment doesn’t matter while including the template. And within the template, whatever the alignment provided will be taken as it is.
Now, let me get into the template where I have defined the details.
ashok@waytoeasylearn:~$ cat mychart/templates/_helpers.tpl
{{- define "mychart.systemlables" }}
labels:
name: AshokKumar
place: Hyderabad
website: www.waytoeasylearn.com
app.kubernetes.io/instance: "{{ $.Release.Name }}"
app.kubernetes.io/version: "{{ $.Chart.AppVersion }}"
app.kubernetes.io/managed-by: "{{ $.Release.Service }}"
{{- end }}
Here I have provided the alignments. With the exact alignments, it will get included. And it isn’t easy to identify or assume where it will get included and at what indentations.
See, for example, I might use this particular label in different YAML files and might use indifferent YAML files, different types of indentation.
So having different files for different indentations is going to be a difficult task. That’s where another type of template includes methodology is introduced that is using the keyword include.
Example
Now let’s do the same demo using the template and overcome that using the include keyword. As a part of the helper, I’m going to introduce another template definition.
I’m providing the name mychart.version; assume I do not have any alignments.
ashok@waytoeasylearn:~$ cat mychart/templates/_helpers.tpl
{{- define "mychart.systemlables" }}
labels:
name: AshokKumar
place: Hyderabad
website: www.waytoeasylearn.com
app.kubernetes.io/instance: "{{ $.Release.Name }}"
app.kubernetes.io/version: "{{ $.Chart.AppVersion }}"
app.kubernetes.io/managed-by: "{{ $.Release.Service }}"
{{- end }}
{{- define "mychart.version" -}}
app_name: {{ .Chart.Name }}
app_version: "{{ .Chart.Version }}"
{{- end -}}
Now I’m going to include this particular template using the keyword template. So template mychart.version I’m including.
ashok@waytoeasylearn:~/mychart/templates$ cat configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
{{- template "mychart.systemlables" $ }}
{{- template "mychart.version" $ }}
data:
myvalue: "Sample Config Map"
message: {{ .Values.message }}
website: {{ upper .Values.website }}
ownerName: {{ quote .Values.owner.name }}
ownerPlace: {{ quote .Values.owner.place }}
Now, let me go ahead and do a dry run and check how it’s working.
ashok@waytoeasylearn:~$ helm install --debug --dry-run templatedemo ./mychart/
install.go:173: [debug] Original chart version: ""
install.go:190: [debug] CHART PATH: /home/ashok/mychart
Error: YAML parse error on mychart/templates/configmap.yaml: error converting YAML to JSON: yaml: line 10: did not find expected key
helm.go:81: [debug] error converting YAML to JSON: yaml: line 10: did not find expected key
YAML parse error on mychart/templates/configmap.yaml
helm.sh/helm/v3/pkg/releaseutil.(manifestFile).sort /home/circleci/helm.sh/helm/pkg/releaseutil/manifest_sorter.go:146 helm.sh/helm/v3/pkg/releaseutil.SortManifests /home/circleci/helm.sh/helm/pkg/releaseutil/manifest_sorter.go:106 helm.sh/helm/v3/pkg/action.(Configuration).renderResources
/home/circleci/helm.sh/helm/pkg/action/action.go:165
helm.sh/helm/v3/pkg/action.(Install).Run /home/circleci/helm.sh/helm/pkg/action/install.go:240 main.runInstall /home/circleci/helm.sh/helm/cmd/helm/install.go:242 main.newInstallCmd.func2 /home/circleci/helm.sh/helm/cmd/helm/install.go:120 github.com/spf13/cobra.(Command).execute
/go/pkg/mod/github.com/spf13/cobra@v1.1.1/command.go:850
github.com/spf13/cobra.(Command).ExecuteC /go/pkg/mod/github.com/spf13/cobra@v1.1.1/command.go:958 github.com/spf13/cobra.(Command).Execute
/go/pkg/mod/github.com/spf13/cobra@v1.1.1/command.go:895
main.main
/home/circleci/helm.sh/helm/cmd/helm/helm.go:80
runtime.main
/usr/local/go/src/runtime/proc.go:204
runtime.goexit
/usr/local/go/src/runtime/asm_amd64.s:1374
It’s going to give the parsing error. The reason is that it doesn’t get appropriately indented. I can overcome this particular problem by using include keyword. Let me go ahead and edit the template file.
Using include keyword
So here I’m going to use include keyword. Include provides the additional option of mentioning how much indentation I wanted for this particular template using the indent keyword.
I included the labels’ lines in this particular template, which need to come after four spaces. So indent I will mention four that will be done using the pipeline and here. I’m going to say the keyword include, name of the template to include, and dot to pass the current scope. Then pipe and how much amount of indent I wanted.
For even better understanding, Let me include the same thing over here and the data section. If I wanted that to get listed along with the data, then the indent should be of 2 spaces.
Here I can mention the same thing with indent as 2.
ashok@waytoeasylearn:~/mychart/templates$ cat configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
{{- template "mychart.systemlables" $ }}
{{ include "mychart.version" $ | indent 4 }}
data:
myvalue: "Sample Config Map"
message: {{ .Values.message }}
website: {{ upper .Values.website }}
ownerName: {{ quote .Values.owner.name }}
ownerPlace: {{ quote .Values.owner.place }}
{{ include "mychart.version" $ | indent 2 }}
Let me go ahead and do a dry run.
ashok@waytoeasylearn:~$ helm install --debug --dry-run templatedemo ./mychart/
install.go:173: [debug] Original chart version: ""
install.go:190: [debug] CHART PATH: /home/ashok/mychart
NAME: templatedemo
LAST DEPLOYED: Mon May 24 13:14:22 2021
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
- LangUsed:
- Python
- Ruby
- Java
- Scala
message: Welcome to waytoeasylearn
owner:
name: Ashok Kumar
place: Hyderabad
qualification: mca
tags:
bigdata: hadoop
deployment: helm
devops: kubernetes
programming: java
website: www.waytoeasylearn.com
HOOKS:
MANIFEST:
Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: templatedemo-configmap
labels:
name: AshokKumar
place: Hyderabad
website: www.waytoeasylearn.com
app.kubernetes.io/instance: "templatedemo"
app.kubernetes.io/version: "1.16.0"
app.kubernetes.io/managed-by: "Helm"
app_name: mychart
app_version: "0.1.0"
data:
myvalue: "Sample Config Map"
message: Welcome to waytoeasylearn
website: WWW.WAYTOEASYLEARN.COM
ownerName: "Ashok Kumar"
ownerPlace: "Hyderabad"
app_name: mychart
app_version: "0.1.0"
Yes, It’s appropriately generated. Here the app_name and app_version got included with four spaces because the label demands four spaces, and along with the data, it got included with two spaces.
It is always recommended to use include because it will have more control and facilitate reusability. This is for the reusability when I mean that I may want that with four indents in some places. And in some places, I may wish to do that with two indents.
So as per the requirement, I can configure. But if I use the template, that’s going to be a difficult task.
Summary
In a quick summary, we have discussed the different types of keywords to use to include the templates and the template keyword, and all the differences. Which one is better and how to include keyword is much better than template keyword while including the templates.