如何修复 `can't evaluate field extraHosts in type interface {}` in _helpers.tpl in helm
How to fix `can't evaluate field extraHosts in type interface {}` in _helpers.tpl in helm
我正在尝试从 _helpers.tpl
中掌舵的 Umbrella 图表中获取一些值,但由于某种原因我收到错误 executing "gluu.ldaplist" at <.Values.ldap.extraHo...>: can't evaluate field extraHosts in type interface {}
这就是我想要做的。
_helpers.ptl
{{- define "gluu.ldaplist" -}}
{{- $hosts := .Values.ldap.extraHosts -}}
{{- $genLdap := dict "host" (printf "%s-%s" .Release.Name .Values.ldapType) "port" .Values.ldapPort -}}
{{- $hosts := prepend $hosts $genLdap -}}
{{- $local := dict "first" true -}}
{{- range $k, $v := $hosts -}}
{{- if not $local.first -}},{{- end -}}{{- printf "%s:%.f" $v.host $v.port -}}{{- $_ := set $local "first" false -}}
{{- end -}}
{{- end -}}
这是伞图 values.yml
的一部分
values.yml
ldap:
enabled: true
type: opendj
extraHosts: [
host: opendj,
port: 3434
] #array of k,v e.g host: host1, port: port1
目录结构
helm/
charts/
chart_a/
templates/
configMap.yml ----->>> this is where I want to use it
templates/
_helpers.tpl ---->>>> where the failing function is
requirements.yml
values.yml ---------->>> where the ldap values are
configMap.yml
如下所示
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ template "oxauth.fullname" . }}-cm
data:
GLUU_CONFIG_ADAPTER: {{ .Values.global.configAdapterName | quote }}
GLUU_LDAP_URL: {{ template "gluu.ldaplist" . }}
注意:_helpers.tpl
在 main/umbrella 图表下方。 chart_a
是子图。
预期结果类似于 GLUU_LDAP_URL:"opendj:3434"
头盔版本:
Client: &version.Version{SemVer:"v2.10.0", GitCommit:"9ad53aac42165a5fadc6c87be0dea6b115f93090", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.10.0", GitCommit:"9ad53aac42165a5fadc6c87be0dea6b115f93090", GitTreeState:"clean"}
预期结果是 _helpers.tpl
中的函数 {{- define "gluu.ldaplist" -}}
完成且没有错误,即使数组中未提供任何值也是如此。
如果提供了值,则预期的字符串是 host:port
作为输出。
如果这可以通过其他方式完成,我欢迎任何建议。
这可以通过允许父图表中的值覆盖(或提供未指定的)子子图表中的值的全局值来解决。
来自Helm docs on Subcharts and Global Values:
- A subchart is considered “stand-alone”, which means a subchart can never explicitly depend on its parent chart.
- For that reason, a subchart cannot access the values of its parent.
- A parent chart can override values for subcharts.
- Helm has a concept of global values that can be accessed by all charts.
(起初我没想到要搜索 "helm subchart" 但是当我在网上搜索那个词时,这是第一个或第二个结果)
这是解决您的问题的最小示例:
目录结构
helm
├── Chart.yaml
├── charts
│ └── chart_a
│ ├── Chart.yaml
│ └── templates
│ └── configMap.yml
├── templates
│ └── _helpers.tpl
└── values.yaml
注意:我添加了 Chart.yaml
文件以使其实际工作,将 values.yml
重命名为 values.yaml
以便它在默认情况下工作而无需额外的标志,并删除了 requirements.yml
因为没有必要重现问题和解决方案。
values.yaml
global:
ldap:
enabled: true
type: opendj
extraHosts:
- host: opendj
port: 3434
ldapType: xxx
ldapPort: 123
关键是将您拥有的内容嵌套在一个特殊的 global
键下。请注意,我还添加了 ldapType
和 ldapPort
,因为它们在您的 _helpers.tpl
中,并且我修复了您在 extraHosts
下的 YAML 结构。之前的内容实际上并不表示带有 host
和 port
键的地图列表。如果没有此修复,helm
命令不会失败,但也不会输出您想要的内容。
结果
$ helm template .
---
# Source: helm/charts/chart_a/templates/configMap.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm
data:
GLUU_LDAP_URL: release-name-xxx:123,opendj:3434
我正在尝试从 _helpers.tpl
中掌舵的 Umbrella 图表中获取一些值,但由于某种原因我收到错误 executing "gluu.ldaplist" at <.Values.ldap.extraHo...>: can't evaluate field extraHosts in type interface {}
这就是我想要做的。
_helpers.ptl
{{- define "gluu.ldaplist" -}}
{{- $hosts := .Values.ldap.extraHosts -}}
{{- $genLdap := dict "host" (printf "%s-%s" .Release.Name .Values.ldapType) "port" .Values.ldapPort -}}
{{- $hosts := prepend $hosts $genLdap -}}
{{- $local := dict "first" true -}}
{{- range $k, $v := $hosts -}}
{{- if not $local.first -}},{{- end -}}{{- printf "%s:%.f" $v.host $v.port -}}{{- $_ := set $local "first" false -}}
{{- end -}}
{{- end -}}
这是伞图 values.yml
的一部分
values.yml
ldap:
enabled: true
type: opendj
extraHosts: [
host: opendj,
port: 3434
] #array of k,v e.g host: host1, port: port1
目录结构
helm/
charts/
chart_a/
templates/
configMap.yml ----->>> this is where I want to use it
templates/
_helpers.tpl ---->>>> where the failing function is
requirements.yml
values.yml ---------->>> where the ldap values are
configMap.yml
如下所示
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ template "oxauth.fullname" . }}-cm
data:
GLUU_CONFIG_ADAPTER: {{ .Values.global.configAdapterName | quote }}
GLUU_LDAP_URL: {{ template "gluu.ldaplist" . }}
注意:_helpers.tpl
在 main/umbrella 图表下方。 chart_a
是子图。
预期结果类似于 GLUU_LDAP_URL:"opendj:3434"
头盔版本:
Client: &version.Version{SemVer:"v2.10.0", GitCommit:"9ad53aac42165a5fadc6c87be0dea6b115f93090", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.10.0", GitCommit:"9ad53aac42165a5fadc6c87be0dea6b115f93090", GitTreeState:"clean"}
预期结果是 _helpers.tpl
中的函数 {{- define "gluu.ldaplist" -}}
完成且没有错误,即使数组中未提供任何值也是如此。
如果提供了值,则预期的字符串是 host:port
作为输出。
如果这可以通过其他方式完成,我欢迎任何建议。
这可以通过允许父图表中的值覆盖(或提供未指定的)子子图表中的值的全局值来解决。
来自Helm docs on Subcharts and Global Values:
- A subchart is considered “stand-alone”, which means a subchart can never explicitly depend on its parent chart.
- For that reason, a subchart cannot access the values of its parent.
- A parent chart can override values for subcharts.
- Helm has a concept of global values that can be accessed by all charts.
(起初我没想到要搜索 "helm subchart" 但是当我在网上搜索那个词时,这是第一个或第二个结果)
这是解决您的问题的最小示例:
目录结构
helm
├── Chart.yaml
├── charts
│ └── chart_a
│ ├── Chart.yaml
│ └── templates
│ └── configMap.yml
├── templates
│ └── _helpers.tpl
└── values.yaml
注意:我添加了 Chart.yaml
文件以使其实际工作,将 values.yml
重命名为 values.yaml
以便它在默认情况下工作而无需额外的标志,并删除了 requirements.yml
因为没有必要重现问题和解决方案。
values.yaml
global:
ldap:
enabled: true
type: opendj
extraHosts:
- host: opendj
port: 3434
ldapType: xxx
ldapPort: 123
关键是将您拥有的内容嵌套在一个特殊的 global
键下。请注意,我还添加了 ldapType
和 ldapPort
,因为它们在您的 _helpers.tpl
中,并且我修复了您在 extraHosts
下的 YAML 结构。之前的内容实际上并不表示带有 host
和 port
键的地图列表。如果没有此修复,helm
命令不会失败,但也不会输出您想要的内容。
结果
$ helm template .
---
# Source: helm/charts/chart_a/templates/configMap.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm
data:
GLUU_LDAP_URL: release-name-xxx:123,opendj:3434