Search code examples
kuberneteskubernetes-helm

Helm range without leaving global scope


I need to loop through a list of instances and create 1 stateful set for every instance. However, inside range I then limit myself to the scope of that loop. I need to access some global values in my statefulset.

I've solved it by just putting all global objects I need in an env variable but... this very seems hacky.

What is the correct way to loop through ranges while still being able to reference global objects?

Example of my loop

{{- $values := .Values -}}
{{- $release := .Release -}}

{{- range .Values.nodes }}

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: {{ $release.Name }} <-- Global Scope
  labels:
    .
    .
    .    
        env:
          - name: IP_ADDRESS
            value: {{ .ip_address }} <-- From range scope
    .
    .
    .
{{- end }}

Example of values

# Global
image:
  repository: ..ecr.....

# Instances
nodes:

  - node1:
    name: node-1
    iP: 1.1.1.1
  - node2:
    name: node-2
    iP: 1.1.1.1

Solution

  • When entering a loop block you lose your global context when using .. You can access the global context by using $. instead.

    As written in the Helm docs -

    there is one variable that is always global - $ - this variable will always point to the root context. This can be very useful when you are looping in a range and need to know the chart's release name.

    In your example, using this would look something like:

    {{- range .Values.nodes }}
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: {{ $.Release.Name }}
      labels:
        .
        .
        .    
            env:
              - name: IP_ADDRESS
                value: {{ .ip_address }}
        .
        .
        .
    {{- end }}