如何在Helm中遍历嵌套列表生成指定格式资源?
YAML端点配置格式转换方案
问题背景
给定如下values.yaml配置:
configurations: endpoints: - firstEndpoint - firstPath - secondPath - secondEndpoint - thirdPath - fourthPath
需要生成如下结构化资源格式:
- name: firstEndpoint paths: - firstPath - secondPath - name: secondEndpoint paths: - thirdPath - fourthPath
已知若endpoints为map类型时可直接实现,但当前endpoints是嵌套列表结构,每个端点对应后续的路径列表,该如何转换?
解决方案
首先要明确:原YAML的缩进写法,实际解析后endpoints是一个嵌套列表——每个顶级列表项都是一个子列表,子列表第一个元素是端点名称,剩余元素为对应路径。基于这个结构,可以用以下两种方式实现转换:
1. Helm模板实现(K8s Helm场景)
在Helm模板中通过遍历嵌套列表完成转换:
{{- range $item := .Values.configurations.endpoints }} - name: {{ index $item 0 }} paths: {{- range $path := after 1 $item }} - {{ $path }} {{- end }} {{- end }}
2. yq命令行实现(通用YAML处理场景)
使用yq(v4版本)工具执行命令直接转换:
yq '.configurations.endpoints[] | {"name": .[0], "paths": .[1:]}' values.yaml
核心逻辑
不管哪种方式,核心都是:
- 遍历
endpoints下的每个子列表; - 子列表的第一个元素作为
name字段值; - 子列表从第二个元素开始的所有内容,作为
paths数组的元素。
内容的提问来源于stack exchange,提问作者carrotcakeslayer
相关产品推荐
相关产品推荐

