解析头盔包中的configmap时出现渲染错误

时间:2019-10-16 07:27:43

标签: go kubernetes-helm

我有一个头盔包,其values.yaml包含以下内容:

ere:
  adm-users:
  - userName: test1
    password: test2
  - useName: user3
    password: user4

并且我想将这些值动态地包含在xml文件中,为此我在deployment.yaml中包含了一个configmap。我的configmap包含以下内容:

data:
  PoolServer.xml: {{ tpl (.Files.Get "files/config/PoolServer.xml") . | nindent 4 }}

在我的PoolServer.xml中,我具有以下内容:

{{- range $index, $val := .Values.ere.adm-users }}
<User Name="{{ tpl "{{ $val.userName }}" $ }} " Password="{{ tpl "{{ $val.password }}" $ }}" />
{{- end }

这是我做了很多更改后的样子,但似乎不起作用。

当我皮棉失败时,出现错误:

[ERROR] templates/: render error in "eric-em-ere/templates/deployment-ere.yaml": template: eric-em-ere/templates/deployment-ere.yaml:25:28: executing "eric-em-ere/templates/deployment-ere.yaml" at <include (print $.Tem...>: error calling include: template: eric-em-ere/templates/configmap.yaml:14:21: executing "eric-em-ere/templates/configmap.yaml" at <tpl (.Files.Get "fil...>: error calling tpl: Error during tpl function execution for "<User Name=\"{{ .Values.ere.adm-users.userName }}\" Password=\"{{ .Values.ere.adm-users.password }}\" />\r\n": parse error in "eric-em-ere/templates/deployment-ere.yaml": template: eric-em-ere/templates/deployment-ere.yaml:1: bad character U+002D '-'

请帮助我指出我在这里做错了。

1 个答案:

答案 0 :(得分:0)

Go text/template documentation会提示您实际的错误消息:在.Values.foo.bar表达式中,每个部分都必须是有效的Go名称,不能包含连字符。常规值的名称是驼峰式的,因此您可以将变量引用和值的名称都更改为admUsers(大写“ U”,不带连字符)。

如果您的tpluserName始终是简单的字符串,则password的多个层次会造成混乱,并且可能不必要。您也无需将range的迭代器分配给任何对象,并且(与标准Go不同)(如果仅分配一个变量,则它将是值)。

我可能将此循环写为:

{{/* Protect against .Values.ere being missing entirely */}}
{{- $ere := .Values.ere | default dict -}}
{{- range $ere.admUsers }}
<User Name="{{ .userName }}" Password="{{ .password }}" />
{{- end }}

如果希望将模板语法放在用户名和密码的values.yaml文件中,则需要为tpl构造一个适当的表达式;您无法按照显示的方式嵌套模板语法。

{{- $top := . -}}
{{- $ere := .Values.ere | default dict -}}
{{- range $ere.admUsers }}
<User Name="{{ tpl .userName $top }}" Password="{{ tpl .password $top }}" />
{{- end }}

如果您想构造一个{{ .userName }}之类的字符串并对其求值,您可以 ,但是将花括号放在模板中会很棘手。我认为循环的内部主体与我的第一种形式等效(它最终打印出循环中每个元素的userNamepassword)。