Helm range without leaving global scope

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 }}

The question is about the global scope, but it is possible to keep access to any outer scope by storing it, like this:

{{- $outer := . -}}

Then, if you use named variables for the range, like this:

{{- range $idx, $node := .Values.nodes }}

You don't need ., so you can restore the outer scope, like this:

{{- with $outer -}}

In your example, using this would look something like:

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

If you need to access the global scope only, simply add {{- with $ -}} will do.

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