为了账号安全,请及时绑定邮箱和手机立即绑定

如何修复 helm _helpers.tpl 中的“无法评估类型接口 {} 中的字段”

如何修复 helm _helpers.tpl 中的“无法评估类型接口 {} 中的字段”

Go
当年话下 2023-07-10 15:01:54
我试图从舵中的伞图中获取一些值_helpers.tpl,但由于某种原因我收到了错误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.ymlldap:  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: v1kind: ConfigMapmetadata:  name: {{ template "oxauth.fullname" . }}-cmdata:  GLUU_CONFIG_ADAPTER: {{ .Values.global.configAdapterName | quote }}  GLUU_LDAP_URL: {{ template "gluu.ldaplist" . }}注意:_helpers.tpl位于主/伞图下方。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"}预期结果是,即使数组中未提供任何值,函数{{- define "gluu.ldaplist" -}}也会顺利完成。_helpers.tpl如果提供了值,则预期的字符串将host:port作为输出。如果可以以其他方式完成此操作,我欢迎任何建议。
查看完整描述

1 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

这可以通过全局值来解决,全局值允许父图表中的值覆盖(或提供未指定的)子子图表中的值。

来自关于子图和全局值的 Helm 文档:

  1. 子图被视为“独立”,这意味着子图永远不能显式依赖于其父图。

  2. 因此,子图无法访问其父图的值

  3. 父图表可以覆盖子图表的值。

  4. Helm 有一个全局值的概念,所有图表都可以访问它

(起初我并没有想到要搜索“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,并且我修复了您在 下的 YAML 结构extraHosts。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


查看完整回答
反对 回复 2023-07-10
  • 1 回答
  • 0 关注
  • 143 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信