Helm: القيم غير موجودة مع حلقة عبر نطاق

تم إنشاؤها على ١٠ أكتوبر ٢٠١٦  ·  14تعليقات  ·  مصدر: helm/helm

تابع هذا العدد # 1055

تحاول أن تفعل نفس التفكير مع:

{{ 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. يتم تجاوز النطاق . في بنية التحكم.

لقد جربت عدة طرق للتغلب على هذا ، لكن الأفضل هو الحل في المثال أعلاه. بمناسبة إغلاق هذا.

هذا الشيء لي أيضا :(

technosophos ربما يمكنك التفكير في تغيير هذا السلوك؟ على سبيل المثال ، إهمال التكرار مع النطاق دون تعيين المتغيرات صراحةً ، والحفاظ على النطاق

هذا شيء يؤديه Go كجزء من النص / القالب ، لذلك لا يوجد شيء عملي في Helm مباشرة. يتغير النطاق عند التكرار من خلال بنية تحكم مثل range . أفضل رهان لتغيير هذا السلوك هو إرسال خطأ إلى المنبع باستخدام Go نفسه.

المستندات ذات الصلة من النص / النموذج :

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

يجب أن تكون قيمة خط الأنابيب مصفوفة أو شريحة أو خريطة أو قناة. إذا كانت قيمة خط الأنابيب يبلغ طولها صفرًا ، فلا يوجد شيء ناتج ؛ وبخلاف ذلك ، يتم تعيين النقطة على العناصر المتتالية من المصفوفة أو الشريحة أو الخريطة ويتم تنفيذ T1 . إذا كانت القيمة عبارة عن خريطة وكانت المفاتيح من النوع الأساسي بترتيب محدد ("قابل للمقارنة") ، فستتم زيارة العناصر بترتيب مفتاح مفروز.

لسبب ما ، بدا أن الحل البديل $root يعمل بالنسبة لي للحظات ولكنه الآن يختنق به:
Error: UPGRADE FAILED: unable to recognize "": no matches for /, Kind=Deployment
لم أعمل في المشروع لفترة. ليس لدي أي فكرة عما تغير بينهما. إزالة التخصيص $root يزيل هذا الخطأ.

حسنًا ، لقد بدأ العمل مرة أخرى عندما أزلت أحد - مما أدى إلى {{- $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" $ }}

(أنا أستخدم 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 / الرسوم البيانية / المستهلك / القوالب / _ المستهلك. tpl: 84 : 33: تنفيذ "loadconsumerConfigFiles" على واجهة تقييم مؤشر الصفري {} .Glob.

لدي ملف configmap.yaml الذي يستدعي نموذجًا واحدًا على النحو التالي -

{{- $ root: =. -}}
{{range $ example_id، $ value: = .Values.instance_names}}
الإصدار: v1.0
النوع: ConfigMap
البيانات الوصفية:
الاسم: {{$ .Release.Name}} - {{$ .Values.maasappname}} - {{$ example_id}} - configmap
البيانات:

{{template "loadconsumerConfigFiles" (ict $ signature_id) $}}

{{نهاية}}

ولديّ هذا loadconsumerConfigFiles في ملف القالب -
{{- تعريف "loadconsumerConfigFiles" -}}
{{- $ root: =. -}}
{{- $ arg1: = index. "0" -}}
{{- ملف $: =. الملفات}}
{{- range $ path، $ byte: = $ root.Files.Glob "config / *"}}

فهمت هذا الخطأ. أحاول بشكل أساسي تمرير example_id كمعامل إلى loadconsumerConfigFiles حتى أتمكن من استخدام هذا داخل هذا القالب. هل يمكنك مساعدة ما أنا في عداد المفقودين. لقد نجحت بالفعل في اجتياز سياق الجذر هذا. لا يزال يظهر الخطأ.

لقد نجح هذا الأمر بالنسبة لي لإعادة تعيين النطاق إلى الجذر والحفاظ على العنصر الذي أكرره. كان لهذا ميزة العمل على حل خطأ في IntelliJ حيث لم يتمكن من العثور على تعريف المتغيرات التي تشير إلى $root

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

حسنا شكرا كثيرا.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات