Helm: Los valores no existen con bucle sobre un rango

Creado en 10 oct. 2016  ·  14Comentarios  ·  Fuente: helm/helm

Siga este número # 1055

tratando de hacer lo mismo pensar con:

{{ range $k, $v := until (atoi (quote .Values.Replicas) | default 5) }}
apiVersion: v1
kind: Service
metadata:
  name: zookeeper-{{$v}}
  namespace: {{ .Values.Namespace }}
  labels:
    node: "zookeeper-{{$v}}"
  annotations:
    "helm.sh/created": {{ .Release.Time.Seconds | quote }}
    service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
spec:
  ports:
  - port: {{.Values.PeerPort}}
    name: peer
  - port: {{.Values.LeaderElectionPort}}
    name: leader-election
  - port: {{.Values.ClientPort}}
    name: client
  selector:
    component: "{{.Release.Name}}-{{.Values.Component}}"
    zookeepernode: "zookeeper-{{$v}}"
{{ end }}

Pero me sale este error:

Error: render error in "zookeeper/templates/deployment.yaml": template: zookeeper/templates/deployment.yaml:6:22: executing "zookeeper/templates/deployment.yaml" at <.Values.global.names...>: can't evaluate field Values in type int

¿Puedo olvidar algo, alguna idea?

Comentario más útil

@worldsayshi Por lo que vale, acabo de encontrarme con el mismo problema, y ​​resulta que hay un poco de documentación relevante en la sección de variables :

However, 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 need to know the chart’s release name.

Resulta que es más sencillo hacer algo como esto si necesita acceder al contexto raíz desde un bloque range :

{{- range $key, $value := .Values.someHash }}
  {{ $key }}: {{ print $.Values.prefix ":" $value | quote }}
{{- end }}

Todos 14 comentarios

finalmente encuentro un truco, pero puede que sea algo que podamos mejorar.

{{- $root := . -}}

{{ range $k, $v := until (atoi (quote .Values.Replicas) | default 5) }}
apiVersion: v1
kind: Service
metadata:
  name: zookeeper-{{$v}}
  namespace: {{ $root.Values.Namespace }}
  labels:
    node: "zookeeper-{{$v}}"
  annotations:
    "helm.sh/created": {{ $root.Release.Time.Seconds | quote }}
    service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
spec:
  ports:
  - port: {{$root.Values.PeerPort}}
    name: peer
  - port: {{$root.Values.LeaderElectionPort}}
    name: leader-election
  - port: {{$root.Values.ClientPort}}
    name: client
  selector:
    component: "{{$root.Release.Name}}-{{$root.Values.Component}}"
    zookeepernode: "zookeeper-{{$v}}"
{{ end }}

Oh, sí ... esa es una de las cosas más esotéricas de las plantillas Go. El alcance . se anula en una estructura de control.

Probé algunas formas de solucionar esto, pero la mejor es la solución del ejemplo anterior. Marcando esto cerrado.

Esto también me mordió :(

@technosophos ¿ Quizás podrías considerar cambiar este comportamiento? es decir, desaprobar la iteración con rango sin asignar variables explícitamente y preservar el alcance

Esto es algo que Go realiza como parte del texto / plantilla, por lo que no hay nada procesable en Helm directamente. El alcance cambia cuando se itera a través de una estructura de control como range . Lo mejor que puede hacer para cambiar este comportamiento sería enviar un error en sentido ascendente al propio Go.

documentos relevantes de texto / plantilla :

{{range pipeline}} T1 {{end}}

El valor de la canalización debe ser una matriz, un sector, un mapa o un canal. Si el valor de la tubería tiene una longitud cero, no se emite nada; de lo contrario, el punto se establece en los elementos sucesivos de la matriz, el sector o el mapa y se ejecuta T1 . Si el valor es un mapa y las claves son de tipo básico con un orden definido ("comparable"), los elementos se visitarán en orden de clave ordenado.

Por alguna razón, la solución $root pareció funcionar para mí momentáneamente, pero ahora se está ahogando:
Error: UPGRADE FAILED: unable to recognize "": no matches for /, Kind=Deployment
No trabajé en el proyecto por un tiempo. No tengo idea de lo que cambió en el medio. Eliminar la asignación $root elimina este error.

Ok, entonces empezó a funcionar de nuevo cuando eliminé uno de los - resultando en {{- $root := . }} . Probablemente estoy malinterpretando algo.

Editar : Entonces, un texto relevante de la documentación de la plantilla de Go es:

Sin embargo, para ayudar a formatear el código fuente de la plantilla, si el delimitador izquierdo de una acción (por defecto "{{") es seguido inmediatamente por un signo menos y un carácter de espacio ASCII ("{{-"), todos los espacios en blanco finales se recortan del texto inmediatamente anterior. De manera similar, si el delimitador derecho ("}}") está precedido por un espacio y un signo menos ("-}}"), todos los espacios en blanco iniciales se recortan del texto inmediatamente siguiente. En estos marcadores de ajuste, el espacio ASCII debe estar presente; "{{-3}}" se analiza como una acción que contiene el número -3.

Edit2 : Esto se

# We assign the current context to a variable to access it in range iteration below
{{- $self := . -}}
{{ printf "%#v" $ }}

(De hecho, estoy usando self como parámetro de asignación en lugar de root)
Además, no funciona sin agregar un comentario inicial al documento.

@worldsayshi Por lo que vale, acabo de encontrarme con el mismo problema, y ​​resulta que hay un poco de documentación relevante en la sección de variables :

However, 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 need to know the chart’s release name.

Resulta que es más sencillo hacer algo como esto si necesita acceder al contexto raíz desde un bloque range :

{{- range $key, $value := .Values.someHash }}
  {{ $key }}: {{ print $.Values.prefix ":" $value | quote }}
{{- end }}

Si alguien viene aquí tan confundido como yo sobre cómo aplicar la elegante solución de @DeviateFish a las funciones de la plantilla (como las que obtiene gratis en helm create ), solo necesita pasar el contexto adecuado al función de plantilla.

{{ range tuple "fizz" "buzz" }}
...
{{ template "foobar.fullname" $ }}  # Worky.
{{ template "foobar.fullname" . }}  # No worky.
...
{{ end }}

Buena plantilla de @killix ... una cosa que me tomó un par de intentos de detectar fue que el ejemplo al principio de este hilo debería tener un --- al final de la plantilla para separar los servicios creados en el círculo. Espero que eso le ahorre a alguien más unos minutos de depuración.

Tengo algún problema con este alcance y aparece el error - Error: ACTUALIZACIÓN FALLIDA: plantilla: maas360 / charts / consumer / templates / _consumer. tpl: 84 : 33: ejecutando "loadconsumerConfigFiles" en: puntero nulo evaluando interfaz {} .Glob.

Tengo mi configmap.yaml que llama a una plantilla como se muestra a continuación:

{{- $ raíz: =. -}}
{{rango $ id_instancia, $ valor: = .Values.nombres_instancia}}
apiVersion: v1
tipo: ConfigMap
metadatos:
nombre: {{$ .Release.Name}} - {{$ .Values.maasappname}} - {{$ instance_id}} - configmap
datos:

{{plantilla "loadconsumerConfigFiles" (dict $ instance_id) $}}

{{fin}}

Y tengo este loadconsumerConfigFiles en el archivo de plantilla -
{{- define "loadconsumerConfigFiles" -}}
{{- $ raíz: =. -}}
{{- $ arg1: = índice. "0" -}}
{{- $ archivo: = .Files}}
{{- rango $ ruta, $ byte: = $ root.Files.Glob "config / *"}}

Recibo este error. Básicamente, estoy tratando de pasar instance_id como parámetro a loadconsumerConfigFiles para poder usar esto dentro de esa plantilla. ¿Podrías ayudarme con lo que me estoy perdiendo? Ya he pasado ese contexto raíz. todavía muestra el error.

Esto funcionó para mí para restablecer el alcance a la raíz y preservar el elemento sobre el que estoy iterando. Esto tuvo la ventaja de solucionar un error en IntelliJ en el que no pudo encontrar la definición de variables que hacen referencia a $root

{{- range .Values.deployments }}
{{- $rangeItem := . -}}
{{- with $ }}
---
apiVersion: apps/v1
kind: Deployment
  name: {{ $rangeItem.name }}
  labels:
    - organization: {{ .Values.organization }}
# etc etc
... 
{{- end }}
{{- end }}

OK muchas gracias.

¿Fue útil esta página
0 / 5 - 0 calificaciones