我有一个头盔包,其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 '-'
请帮助我指出我在这里做错了。
答案 0 :(得分:0)
Go text/template documentation会提示您实际的错误消息:在.Values.foo.bar
表达式中,每个部分都必须是有效的Go名称,不能包含连字符。常规值的名称是驼峰式的,因此您可以将变量引用和值的名称都更改为admUsers
(大写“ U”,不带连字符)。
如果您的tpl
和userName
始终是简单的字符串,则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 }}
之类的字符串并对其求值,您可以 ,但是将花括号放在模板中会很棘手。我认为循环的内部主体与我的第一种形式等效(它最终打印出循环中每个元素的userName
和password
)。