我正在尝试获取 Values.yaml 中定义的所有键的列表。现在我添加了一个额外的变量只是为了将键保存为列表,这不是最好的解决方案。有没有办法获取地图中所有键的列表?
由于我在另一个 value.yaml 中将相同的变量定义为列表,因此我想第一次展平地图以获取列表,以便我可以在我的 helm 模板上具有相同的循环逻辑。
我想循环遍历地图并创建一个动态列表。但似乎不可能,因为列表是不可变的。
值.yaml
default:
environment_names: ## this is what i want to eliminate
- preview
- preview-test
environments:
preview:
server: https://sds
something: adkfgdf
preview-test:
server: https://sds
staging:
server: https://35.246.225.83
Application.yaml 模板
{{- range $service := $.Values.services }}
{{- $environment_names := $.Values.default.environment_names }} ## default value (here i want to write a funtion which would flatten the map and return the keys)
{{- if $service.environments }} ## if defined in another vaues.yaml as list
{{- $environment_names:= $service.environments }}
{{- range $env_name := $environment_names }} ## looping through the environments
{{- $environment := get $.Values.default.environments $env_name }} ## reading from the map from default
---
apiVersion: argoproj.io/v1alpha1
kind: Application
debug1: {{ $environment_names }}
debug: {{ $env_name }}
debug2: {{ $service.name }}
{{- end }}
{{- end }}
{{- end }}
这是我如何获取模板中的键列表(我尝试使用对我不起作用的功能,因此可以改进)
{{- $env_list:= list }}
{{- range $k,$v:= $.Values.default.environments }}
{{- $env_list = append $env_list $k }}
{{- end }}
{{- range $service := $.Values.services }}
{{- $environment_names:= ternary $service.environments $env_list (hasKey $service "environments") }}
我可以用
$.Values.default.environment_names
替换 env_list
并且它可以工作。
keys
函数,它完全按照您的要求执行:给定一个 dict 类型对象(如 .Values
),它以列表形式返回其键。
对于您显示的 Helm 模板的整体结构,请记住,可以构建其他值文件并使用
helm install -f
和类似选项传递它们;您不必将每个可能环境的所有可能设置都放在单个 values.yaml
文件中。 我可能会为每个环境创建一个单独的文件:
# values-preview.yaml
server: https://sds
something: adkfgdf
# values-staging.yaml
server: https://35.246.225.83
现在,例如,如果您
helm install -f values-staging.yaml
,那么 .Values.server
将扩展到服务器的配置位置,而无需显示任何复杂的条件逻辑。