【问题标题】:With helm template file conditionally set a variables used throughout template file使用 helm 模板文件有条件地设置整个模板文件中使用的变量
【发布时间】:2021-09-02 14:22:20
【问题描述】:

我想在 helm 模板文件的顶部有条件地设置一个“go”变量,然后稍后在模板文件中使用它。这是我尝试过但不起作用的方法:

在模板文件的顶部,我执行以下操作:

{{- if eq $.Values.kafka.create true -}}
{{- $kafka_port := 9094 -}}
{{- else -}}
{{- $kafka_port := $.Values.kafka.port -}} 
{{- end }}

但是当我尝试执行“helm install”时,我得到一个解析错误,我稍后在模板文件中使用 $kafka_port。具体错误是:

错误:在 (tombolo/templates/tom-node-launch.yaml:89) 处解析错误:未定义变量“$kafka_port”

【问题讨论】:

    标签: go kubernetes-helm go-templates


    【解决方案1】:

    Go text/template 语言(不同于 Go 编程语言本身)没有全局变量。

    你可以做的是写一个helper template,通常在templates/_helpers.tpl,生成这个片段:

    {{- define "kafka.port" -}}
    {{- if .Values.kafka.create -}}
    9094
    {{- else -}}
    {{- .Values.kafka.port -}}
    {{- end -}}
    

    这个模板输出调用时的端口号;它的单个参数应该是标准的top-level Helm object

    - name: KAFKA_PORT
      value: {{ include "kafka.port" . | quote }}
    

    或者,如果在特定的上下文中,您碰巧需要它作为变量,您可以将它包含在其中(使用Helm include extension 将被调用模板的输出捕获为字符串);但仅限于其特定的模板或文件。

    {{- $kafkaPort := include "kafka.port" . }}
    - name: KAFKA_PORT
      value: {{ quote $kafkaPort }}
    - name: KAFKA_BROKER_URL
      value: kafka://{{ include "kafka.name" . }}:{{ $kafkaPort }}
    

    【讨论】:

      【解决方案2】:

      您的示例很短,很适合您的用例。

      但作为一般规则:当您开始在模板中编写代码时,也可能表明您应该在控制器部分(go 代码)中编写代码:

      type KafkaCfg struct {
          port   int
          create bool
      }
      
      const kafkaCreationPort = 9094
      
      func (c KafkaCfg) Port() int {
          if c.create {
              return kafkaCreationPort
          }
          return c.port
      }
      
      
      func someWhereElse() {
          var data struct {
              Values struct {
                  Kafka KafkaCfg
              }
          }
      
          data.Values.Kafka.create = true
          helmTemplate.Execute(w, data)
      }
      
      // in your template :
      
      {{ .Values.Kafka.Port }} {{ /* <- will call the .Port() method */ }}
      

      https://play.golang.org/p/6pNHY0kcegp

      【讨论】:

        【解决方案3】:

        在外部块中定义变量:

        {{- $kafka_port := 9094 -}}
        {{- if eq $.Values.kafka.create false -}}
        {{- $kafka_port = $.Values.kafka.port -}} 
        {{- end }}
        

        【讨论】:

          猜你喜欢
          • 2022-08-16
          • 2020-01-12
          • 2021-12-07
          • 1970-01-01
          • 1970-01-01
          • 2016-06-01
          • 2021-12-03
          • 1970-01-01
          • 2022-08-19
          相关资源
          最近更新 更多