我正在使用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 }}
答案 0 :(得分:2)
您应该能够将模板的输出通过sprig包中的indent
函数进行管道传输:
{{ if (eq .Case "service")
service:
# need to indent! so contents become members of service:
{{ template "pod" | indent 4 }}
{{ end }}
答案 1 :(得分: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" . }}
答案 2 :(得分:0)
您可以自由缩进,但是您需要使用include
而不是template
,因为template
是一个动作,不能传递给其他函数:
{{ include "pod" | indent 4 }}
有关更多信息,请参见Helm guide。
答案 3 :(得分:0)
@Giovanni Bassi的答案仅在掌舵时有效。 include
函数在helm
here中定义。
与@tmirks答案中的indent
from sprig
结合使用,您将得到:
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 }}