HELM-如何使用复数值迭代映射 [英] helm - how to iterate over map with complex values

查看:8
本文介绍了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

包含简单字符串值的映射(标签)和包含结构化值的映射(标签1)的文件values.yaml:

---
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是保存对象的变量,则实际上可以使用类似$v.name的语法。

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个空格,但随后删除前导空格和尾随空格;如果没有值,则显式写出一个空列表。)

通常更容易指定您希望值采用的格式,并使用该格式。如果您出于某种原因不能确定您拥有的是哪种表单,模板语言包含functions to test on a value's type,因此原则上您可以测试:

env:
{{- range $k, $v := .Values.labelN }}
{{- if kindIs "string" $v }}
  - name: {{ $k }}
    value: {{ $v }}
{{- else }}
  - name: {{ $v.name }}
    value: {{ $v.value }}
{{- end }}
{{- else }}
  []
{{- end }}

这篇关于HELM-如何使用复数值迭代映射的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆