【问题标题】:How to fix `can't evaluate field extraHosts in type interface {}` in _helpers.tpl in helm如何修复 helm 中 _helpers.tpl 中类型接口 {} 中的“无法评估字段 extraHosts”
【发布时间】:2019-08-05 18:19:42
【问题描述】:

我正在尝试从 _helpers.tpl 的 helm 中的 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 位于主/伞形图下方。 chart_a 是一个子图。

预期结果类似于GLUU_LDAP_URL:"opendj:3434"

Helm 版本:

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 作为输出。

如果这可以通过其他方式完成,我欢迎任何建议。

【问题讨论】:

  • “host: opendj”和“port: 3434”在你的 YAML 中没有配对。如果您想对数组使用 [ ... ],请将主机/端口对包装在 { ... } 中。或者删除方括号并使用 - 表示每个主机/端口对的新数组项。
  • 我认为这不是问题所在。当我将extraHosts 放在 ldap 之外时,它会被正常调用。
  • 如果您能提供一个完整的最小示例将会很有帮助。你的目录结构是什么,你正在运行什么命令,Helm 是什么版本,你的预期输出是什么。这样人们就可以尝试在本地复制。
  • 我已经更新了描述。 @AmitKumarGupta
  • 不幸的是,这些信息不足以让我尝试重现。首先,您是说templatesrequirements.ymlvalues.ymlcharts 目录的兄弟,而不是在chart_b 目录中?另外,您正在运行什么命令?你能提供一个完整的最小例子吗?这可能需要创建一个虚拟的非_xxx.tpl 文件,以便helm template 不是空操作。您可以显示运行 helm template 所期望的输出(如果这确实是您正在运行的命令,我不知道),就像您显示输入 values.yml 一样。

标签: go kubernetes kubernetes-helm templating gluu


【解决方案1】:

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

来自Helm docs on Subcharts and Global Values

  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 键下。请注意,我还添加了ldapTypeldapPort,因为它们在您的_helpers.tpl 中,并且我修复了您在extraHosts 下的YAML 结构。之前的内容实际上并不代表带有hostport 键的映射列表。如果不进行此修复,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

【讨论】:

  • 我能再问你一件事吗?我正在努力在父图表中引用 serviceNamechart_a。你能帮忙吗?我有一个要在父图表中部署的入口,但入口引用的 service 位于 chart_a
  • 很高兴成功了!至于你的新问题,最好在 StackOverflow 上创建一个新问题。
猜你喜欢
  • 2020-11-09
  • 2020-08-12
  • 2019-11-02
  • 2020-10-21
  • 1970-01-01
  • 2022-08-16
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
相关资源
最近更新 更多