kubernetes-helm - helm - 如何迭代具有复杂值的地图
问题描述
在掌舵图中,想要迭代包含结构化值的地图。
我确实知道如何使用简单的字符串值遍历地图。我还可以遍历包含结构化值的数组(此处未显示)。但是我没有设法遍历包含结构化值的映射。
这是我的目录结构,包含 3 个文件:
templates/test.yaml
Chart.yaml
values.yaml
一个简单的 Chart.yaml 文件(仅用于完成展示):
---
apiVersion: v1
appVersion: "1.0"
description: A Helm chart for Kubernetes
name: foochart
version: 0.1.0
文件 values.yaml 包含一个包含简单字符串值 (label) 和一个包含结构化值 (label1) 的映射:
---
label:
fook: foo
bark: bar
label1:
fook:
name: foo
value: foo1
bark:
name: bar
value: bar2
此模板 test.yaml 有效:
---
env:
{{- range $k, $v := .Values.label }}
- name: {{ $k }}
value: {{ $v }}
{{- end }}
但是当我用 替换时.Values.label
,.Values.label1
它不会产生任何输出。
这是我的测试命令:
helm template foochart
问题:是否可以处理具有结构化值的地图?我想使用类似的东西$v.name
。如果是,我该怎么做?
解决方案
$v.name
如果您知道这$v
是一个包含对象的变量,您实际上可以使用类似的语法。
env:
{{- range $k, $v := .Values.label1 }}
- name: {{ $k }}_{{ $v.name }}
value: {{ $v.value }}
{{- end }}
如果您知道它具有您想要的语法,那么有一个文档不足的toYaml
函数,它接受一个任意对象并将其作为未缩进的 YAML 返回。在您的示例中,每个值都具有env:
项目的形式,如果您知道(或指定)这一点,您可以逐字写出:
env:
{{- range .Values.label1 }}
- {{ . | toYaml | indent 4 | trim }}
{{- else }}
[]
{{- end }}
(在最后一个示例中:我没有分配变量,因此.
暂时重新分配给映射中的每个值,并且键丢失了;对于每个项目,我将其转换为 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 }}
推荐阅读
- frida - 有没有办法在 Frida 中访问“this”?
- python - 管理生成器的 Pythonic 方式
- javascript - 如何在使用 Vuetify 2.x 的表中自定义默认行中使用 v-html?
- html - selenium.common.exceptions.ElementNotInteractableException:消息:元素不可交互
- android - OkHttp POST 请求设置 withCredentials 为 True?
- elasticsearch - 如何在对 Elasticsearch 的 API 请求中指定租户?
- mysql - 为什么 MySQL 为明确定义的列显示未知列?
- javascript - 三元函数执行比 JS 中的 if 语句更好还是更差
- python - 如何将张量与向量相乘?
- python-3.x - 我不明白为什么我的代码中出现此错误。ValueError: 操作数无法与形状 (24,) (26,) 一起广播