Helm utilise le moteur de templates Go. La syntaxe est préfixée : l’opérateur se place avant les arguments.


Conditions if / else

{{- if .Values.ingress.enabled }}
# ce bloc est rendu si ingress.enabled est "truthy"
{{- end }}
 
{{- if .Values.ingress.enabled }}
# avec branche else
{{- else }}
# sinon
{{- end }}

Truthy vs Falsy

Valeur dans values.yamlRésultat du ifRaison
true ou "texte"✅ PasséValeur positive ou remplie
123✅ PasséNombre différent de 0
false, "", 0❌ IgnoréValeurs fausses
[] ou {}❌ IgnoréCollection vide

Opérateurs de comparaison

⚠️ Syntaxe Go : {{ if eq .A .B }} et non {{ if .A == .B }}

OpérateurSignificationExemple
eqÉgal{{ if eq .Values.type "nginx" }}
neDifférent{{ if ne .Values.env "prod" }}
lt / gtPlus petit / grand{{ if gt .Values.replicas 3 }}
le / ge≤ / ≥{{ if le .Values.cpu 1 }}

Opérateurs logiques

OpérateurRôle
andToutes les conditions vraies
orAu moins une vraie
notInverse
{{- if and .Values.ingress.enabled (or (eq .Values.env "prod") .Values.ingress.force) }}
# Rendu si ingress activé ET (env=prod OU force=true)
{{- end }}

Boucles range

# Itérer sur une liste
{{- range .Values.envList }}
  - name: {{ .name | quote }}
    value: {{ .value | quote }}
{{- end }}

⚠️ Changement de scope dans range

SymboleSignification
.L’élément courant de la boucle
$Le contexte global (accès à .Values, .Release)
env:
{{- range .Values.envList }}
  - name: {{ .name | quote }}
    value: {{ .value | default $.Values.globalDefault | quote }}
    # ↑ $.Values = contexte global, .value = élément de la boucle
{{- end }}

Exemple combiné — if + range + scope global

values.yaml :

appType: "web"
monitoring:
  enabled: true
  endpoints:
    - port: 8080
    - port: 9090

templates/config.yaml :

{{- if and .Values.monitoring.enabled (eq .Values.appType "web") -}}
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-config
data:
  {{- range .Values.monitoring.endpoints }}
  service-{{ .port }}: {{ printf "App %s sur port %d" $.Chart.Name .port | quote }}
  {{- end }}
{{- end -}}

Résultat généré :

apiVersion: v1
kind: ConfigMap
metadata:
  name: ma-release-config
data:
  service-8080: "App mon-chart sur port 8080"
  service-9090: "App mon-chart sur port 9090"

Règles à retenir

  1. Syntaxe préfixée : toujours {{ if eq A B }}
  2. Parenthèses : pour grouper and/or
  3. {{- end }} : tout if et range doit se fermer
  4. Tirets : {{- supprime les espaces/lignes avant, -}} après

En relation avec