Helm: ある範囲のループで値が存在しない

作成日 2016年10月10日  ·  14コメント  ·  ソース: helm/helm

この問題に従ってください

同じ考えをしようとしています:

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

しかし、私はこのエラーを受け取ります:

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

何か忘れてしまうかもしれませんが、何か考えはありますか?

最も参考になるコメント

@worldsayshi価値があるので、私はちょうどこの同じ問題に遭遇しました、そしてそれは変数セクションからの関連するドキュメントのビットがあることがわかりました

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.

rangeブロック内からルートコンテキストにアクセスする必要がある場合は、次のようなことを行う方が簡単です。

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

全てのコメント14件

ついに私はトリックを見つけましたが、それは私たちが改善できるものかもしれません。

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

そうそう...それはGoテンプレートのより難解なことの1つです。 .スコープは、制御構造でオーバーライドされます。

これを回避するいくつかの方法を試しましたが、上記の例の解決策が最善です。 これを閉じたとマークします。

これも私を噛んだ:(

@technosophosたぶん、この動作を変更することを検討できますか? つまり、変数を明示的に割り当てずに範囲を使用した反復を廃止し、スコープを保持します

これは、Goがテキスト/テン​​プレートの一部として実行するものであるため、Helmで直接実行できるものはありません。 rangeような制御構造を反復処理すると、スコープが変更されます。 この動作を変更する最善の策は、Go自体を使用してアップストリームでバグを報告することです。

テキスト/テン​​プレートからの関連ドキュメント:

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

パイプラインの値は、配列、スライス、マップ、またはチャネルである必要があります。 パイプラインの値の長さがゼロの場合、何も出力されません。 それ以外の場合、ドットは配列、スライス、またはマップの連続する要素に設定され、T1が実行されます。 値がマップであり、キーが定義された順序(「比較可能」)の基本タイプである場合、要素はソートされたキーの順序でアクセスされます。

何らかの理由で、 $root回避策一時的には機能している
Error: UPGRADE FAILED: unable to recognize "": no matches for /, Kind=Deployment
私はしばらくプロジェクトに取り組みませんでした。 その間に何が変わったのかわかりません。 $root割り当てを削除すると、このエラーがなくなります。

さて、 - 1つを削除すると、再び機能し始め、 {{- $root := . }} 。 私はおそらく何かを誤解しています。

編集Goテンプレートドキュメントの関連テキストは次のとおりです。

ただし、テンプレートのソースコードの書式設定を支援するために、アクションの左区切り文字(デフォルトでは "{{")の直後にマイナス記号とASCIIスペース文字( "{{-")が続く場合、末尾の空白はすべて直前のテキスト。 同様に、右の区切り文字( "}}")の前にスペースとマイナス記号( "-}}")が付いている場合、先頭の空白はすべて、直後のテキストから削除されます。 これらのトリムマーカーには、ASCIIスペースが存在する必要があります。 「{{-3}}」は、数値-3を含むアクションとして解析されます。

Edit2 :これはさらに奇妙になり続けます。 ルート割り当ての直後にprintfステートメントを追加すると、再び機能します。 ため息、私が推測するものは何でも。

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

(私は実際にはrootの代わりにselfを割り当てパラメーターとして使用しています)
また、ドキュメントに最初のコメントを追加しないと機能しません。

@worldsayshi価値があるので、私はちょうどこの同じ問題に遭遇しました、そしてそれは変数セクションからの関連するドキュメントのビットがあることがわかりました

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.

rangeブロック内からルートコンテキストにアクセスする必要がある場合は、次のようなことを行う方が簡単です。

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

@DeviateFishのエレガントなソリューションをテンプレート関数( helm createで無料で入手できるものなど)に適用する方法について私が混乱していた場合は、適切なコンテキストをに渡す必要があります。テンプレート関数。

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

@killixからの素敵なテンプレート...私がいくつか---を付けて、で作成されたサービスを分離する必要があるということ

このスコープに問題があり、エラーが発生します-エラー:アップグレードに失敗しました:テンプレート:maas360 / charts / Consumer / templates / _consumer。 tpl:84 :33:インターフェイス{} .Globを評価するnilポインタで「loadconsumerConfigFiles」を実行します。

以下のように1つのテンプレートを呼び出すconfigmap.yamlがあります-

{{-$ root:=。 -}}
{{range $ instance_id、$ value:= .Values.instance_names}}
apiVersion:v1
種類:ConfigMap
メタデータ:
名前:{{$。Release.Name}}-{{$。Values.maasappname}}-{{$ instance_id}}-configmap
データ:

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

{{終わり}}

そして、私はこのloadconsumerConfigFilesをテンプレートファイルに持っています-
{{-"loadconsumerConfigFiles"を定義します-}}
{{-$ root:=。 -}}
{{-$ arg1:= index。 "0"-}}
{{-$ file:=。Files}}
{{-範囲$ path、$ byte:= $​​ root.Files.Glob "config / *"}}

このエラーが発生します。 基本的に、instance_idをパラメーターとしてloadconsumerConfigFilesに渡して、そのテンプレート内でこれを使用できるようにしようとしています。 私が行方不明になっているものを手伝っていただけませんか。 私はすでにそのルートコンテキストを渡しています。 それでもエラーが表示されています。

これにより、スコープをルートにリセットし、繰り返し処理しているアイテムを保持することができました。 これには、 $root参照する変数の定義が見つからないIntelliJのバグを回避できるという利点がありました。

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

はい、ありがとございます。

このページは役に立ちましたか?
0 / 5 - 0 評価