8

我正在使用 go 模板为 kubernetes 创建 yaml 定义。我正在尝试嵌套模板,但遇到了无法重用定义的问题,因为包含时缩进是错误的。即,在一种情况下,内容需要缩进,但在另一种情况下不需要。如何控制包含内容的缩进?

下面的例子。我正在重用 pod.tmpl,在第一种情况下,它可以按原样包含在内。在第二种情况下,我需要缩进整个内容,使其成为服务成员

{{ if (eq .Case "pod")
  # NO indenting
  {{ template "pod" }}
{{ end }}

{{ if (eq .Case "service")
  service:
    # need to indent! so contents become members of service:
    {{ template "pod" }}
{{ end }}
4

4 回答 4

7

@Giovanni Bassi 的回答仅适用于掌舵。该include函数在helm此处定义。

结合indent来自sprig@tmirks 的答案,你会得到:

func renderTemplate(templatePath string, vars interface{}, out io.Writer) error {
    t := template.New(filepath.Base(templatePath))
    var funcMap template.FuncMap = map[string]interface{}{}
    // copied from: https://github.com/helm/helm/blob/8648ccf5d35d682dcd5f7a9c2082f0aaf071e817/pkg/engine/engine.go#L147-L154
    funcMap["include"] = func(name string, data interface{}) (string, error) {
        buf := bytes.NewBuffer(nil)
        if err := t.ExecuteTemplate(buf, name, data); err != nil {
            return "", err
        }
        return buf.String(), nil
    }

    t, err := t.Funcs(sprig.TxtFuncMap()).Funcs(funcMap).ParseFiles(templatePath)
    if err != nil {
        return err
    }
    err = t.Execute(out, &vars)
    if err != nil {
        return err
    }
    return nil
}

然后

{{ include "pod" | indent 4 }}
于 2019-12-19T00:11:38.310 回答
2

您可以自由缩进,但您需要使用include而不是template,因为template它是一个动作并且不能传递给其他函数:

{{ include "pod" | indent 4 }}

有关更多信息,请参阅Helm 指南

于 2019-10-24T02:26:33.197 回答
1

您应该能够将模板的输出通过管道传输到sprigindent中可用的函数:

{{ if (eq .Case "service")
  service:
    # need to indent! so contents become members of service:
{{ template "pod" | indent 4 }}
{{ end }}
于 2017-05-17T14:44:56.187 回答
0

我发现如果我缩进 pod.tmpl 的内容然后缩进顶部以如下对齐,我可以解决这个问题

{{ if (eq $template "pod.tmpl") }}
    apiVersion: v1
    kind: Pod
{{ end }}
{{ if (eq $template "deployment.tmpl") }}
apiVersion: v1
kind: Deployment
metadata:
  name: {{ .Name }}-deployment
spec:
  replicas: {{ .Scale }}
  template:
{{template "pod" dict "Version" $version "Domain" $domain "Image" $image "ImageDerived" $imageDerived "Service" . }}
于 2017-05-06T22:40:11.407 回答