在舵图中想要迭代包含结构化值的地图。
我确实知道如何使用简单的字符串值迭代地图。我还可以迭代包含结构化值的数组(此处未显示)。但我没有设法迭代包含结构化值的映射。
这是我的目录结构,包含 3 个文件:
templates/test.yaml
Chart.yaml
values.yaml
Run Code Online (Sandbox Code Playgroud)
一个简单的文件 Chart.yaml (仅用于完成展示):
templates/test.yaml
Chart.yaml
values.yaml
Run Code Online (Sandbox Code Playgroud)
文件values.yaml,其中包含一个包含简单字符串值(标签)和一个包含结构化值(标签1)的映射:
---
apiVersion: v1
appVersion: "1.0"
description: A Helm chart for Kubernetes
name: foochart
version: 0.1.0
Run Code Online (Sandbox Code Playgroud)
这个模板 test.yaml 的工作原理:
---
label:
fook: foo
bark: bar
label1:
fook:
name: foo
value: foo1
bark:
name: bar
value: bar2
Run Code Online (Sandbox Code Playgroud)
但是当我替换.Values.label为时.Values.label1,它不会产生任何输出。
这是我的测试命令:
---
env:
{{- range $k, $v := .Values.label }}
- name: {{ $k }}
value: {{ $v }}
{{- end }}
Run Code Online (Sandbox Code Playgroud)
问题:是否可以处理具有结构化值的地图?我想用类似的东西$v.name。如果是,我该怎么做?
Dav*_*aze 47
事实上,$v.name如果您知道这$v是一个保存对象的变量,则可以使用类似的语法。
env:
{{- range $k, $v := .Values.label1 }}
- name: {{ $k }}_{{ $v.name }}
value: {{ $v.value }}
{{- end }}
Run Code Online (Sandbox Code Playgroud)
如果您知道它完全具有您想要的语法,那么有一个文档不足的toYaml函数可以接受任意对象并将其作为无缩进的 YAML 返回。在您的示例中,每个值都具有env:项目的形式,如果您知道(或指定)这一点,则可以按字面写出:
env:
{{- range .Values.label1 }}
- {{ . | toYaml | indent 4 | trim }}
{{- else }}
[]
{{- end }}
Run Code Online (Sandbox Code Playgroud)
(在最后一个示例中:我没有分配变量,因此.临时重新分配给映射中的每个值,并且键丢失;对于每个项目,我将其转换为 YAML,缩进 4 个空格,然后修剪输出前导和尾随空格;如果没有值,我会显式写出一个空列表。)
通常,指定您希望值采用的格式并使用该格式会更容易。如果您由于某种原因无法确定您拥有哪种形式,模板语言包含用于测试值类型的函数,因此原则上您可以测试:
env:
{{- range $k, $v := .Values.labelN }}
{{- if kindIs "string" $v }}
- name: {{ $k }}
value: {{ $v }}
{{- else }}
- name: {{ $v.name }}
value: {{ $v.value }}
{{- end }}
{{- else }}
[]
{{- end }}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
52231 次 |
| 最近记录: |