登录
首页 >  Golang >  Go问答

解压 Helm 模板中的 Go 映射数值

来源:stackoverflow

时间:2024-03-21 21:12:38 194浏览 收藏

在 Helm 模板中,解压 Go 映射数值时可能会遇到困难。文章探讨了解决此问题的方法,介绍了 Helm 中鲜为人知的 `toYaml` 函数。该函数可将任意对象输出为 YAML 格式,为解压映射提供了便捷的方法。通过结合 `toYaml` 和 `indent`,可以轻松地在模板中解压嵌套映射,从而简化 Helm 模板的编写。

问题内容

我似乎无法找到一个简单而有效的解决方案来解决我想象中在 go 模板/helm 中经常出现的问题。基本上,给定一个像这样的values.yaml:

ingress:
  hosts:
  - host: busy-a.local
    paths:
    - backend:
        servicename:busy-a
        serviceport: 80
      path: /busy/[a-z0-9]{1}

和这样的 templates/ingress.yaml:

apiversion: extensions/v1beta1
kind: ingress
metadata:
  name: {{.values.project}}-ingress
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  rules:
  {{- range .values.ingress.hosts }}
    - host: {{ .host | quote }}
      http:
        paths:
        {{- range .paths }}
          - path: {{ .path }}
            backend:
              servicename: {{ .backend.servicename }} # this works
              serviceport: {{ .backend.serviceport }} # but can we shorthand backend?
        {{- end }}
  {{- end }}

但是,在 .paths 范围 中“解压”backend 映射不是更容易吗,就像 backend: {{.backend}} 一样?然而,它似乎并不是这样工作的。

...
    paths:
      - path: /busy/[A-Z0-9]{3}
        backend: map[serviceName:busy-a servicePort:80]

在 go 模板或 sprig 扩展中解压或分配整个对象的首选方法是什么?


解决方案


helm 有 a couple of barely-documented functions,其中之一是 toyaml。它接受任意对象并将其以 yaml 格式写出,不缩进。

在您的情况下,您可以通过组合 toyamlindent 来实现您想要的目标:

spec:
  ...
            backend:
{{ .backend | trim | indent 14 }}
{{/* above line intentionally at left margin */}}

由于 toyaml 可以很好地处理嵌套对象,鉴于您的输入和输出,我可能会将其应用到更高的位置:

spec:
  rules:
  {{- range .Values.ingress.hosts }}
    - host: {{ .host | quote }}
      http:
        paths: {{- .paths | toYaml | trim | nindent 10 }}
  {{- end }}

toyaml 总是会发出尾随换行符,所以我倾向于将 trim 关闭,这样我就可以更好地控制它。在最后一个示例中,我使用 nindent 插入前导换行符,以使模板更加紧凑。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>