K
Q

Helm - Templating variables in values.yaml

May 2, 2019

I'm trying to template variables from a map inside the values.yaml into my final Kubernetes ConfigMap YAML.

I've read through https://github.com/helm/helm/issues/2492 and https://helm.sh/docs/chart_template_guide/ but can't seem to find an answer.

For some context, this is roughly what I'm trying to do:

values.yaml

config:
  key1: value
  key2: value-{{ .Release.Name }}

configmap.yaml

kind: ConfigMap
data:
  config-file: |
    {{- range $key, $value := .Values.config }}
    {{ $key }} = {{ $value }}
    {{- end }}

Where the desired output with would be:

helm template --name v1 mychart/

kind: ConfigMap
data:
  config-file: |
    key1 = value
    key2 = value-v1

I've tried a few variations using template functions and pipelining, but to no avail:

{{ $key }} = {{ tpl $value . }}
{{ $key }} = {{ $value | tpl . }}
{{ $key }} = {{ tpl $value $ }}
-- ahstn
kubernetes
kubernetes-helm
templating

4 Answers

December 28, 2021

I'll refer to the question's title regarding templating variables in helm and suggest another option to use on

values.yaml
which is YAML Anchors.

Docs reference

As written in here:

The YAML spec provides a way to store a reference to a value, and later refer to that value by reference. YAML refers to this as "anchoring":

coffee: "yes, please"

favorite: &favoriteCoffee "Cappucino"

coffees:
  - Latte
  - *favoriteCoffee
  - Espresso

In the above,

&favoriteCoffee
sets a reference to Cappuccino.

Later, that reference is used as

*favoriteCoffee
.
So coffees becomes Latte, Cappuccino, Espresso.

A more practical example

Referring to a common image setup (

Registry
and
PullPolicy
) in all
values.yaml
.

Notice how the default values are being set at

Global.Image
next to the reference definition which starts with
&
:

Global:

  Image:

    Registry: &global-docker-registry "12345678910.dkr.ecr.us-west-2.amazonaws.com" # <--- Default value

    PullPolicy: &global-pull-policy "IfNotPresent" # <--- Default value


Nginx:

  Image:

    Registry: *global-docker-registry

    PullPolicy: *global-pull-policy

    Version: 1.21.4

    Port: 80


MySql:

  Image:

    Registry: *global-docker-registry

    PullPolicy: *global-pull-policy

    Name: mysql

    Version: 8.0.27

    Port: 3306
-- Rotem jackoby
Source: StackOverflow

July 14, 2020

The above would also have worked in this way

values.yaml

config:

  key1: "value"

  key2: "value-{{ .Release.Name }}"

configmap.yaml

kind: ConfigMap
data:
  config-file: |
    {{- range $key, $value := .Values.config }}
    {{ $key }} = {{ tpl $value $ }}
    {{- end }}

What I changed was : I put value in quotes in

value.yaml
and used template
tpl
in the config map.

-- Amrut Prabhu
Source: StackOverflow

May 2, 2019

Managed to solve this using the following syntax:

configmap.yaml

kind: ConfigMap
data:
  config-file: |
    {{- range $key, $value := .Values.config }}
    {{ $key }} = {{ tpl ($value | toString) $ }}
    {{- end }}
-- ahstn
Source: StackOverflow

March 5, 2021

there is fight in this PR here about this topic.

I know that it's possible now, but this require maintenance of the chart to be in-house (e.g. answer of Amrut ).

Let's summarize :

To have templating in

values.yaml
, these are the available options:

  1. helm may support that in future ( watch this thread about this topic.)

  2. use tpl function inside the chart

  3. use another tool on top of helm : terraform or helmfile.

-- Abdennour TOUMI
Source: StackOverflow